Python修改嵌套字典实现日志用户INFO/ERROR计数的方法验证
嵌套字典日志计数问题解答
首先明确结论:你给出的两种写法单独使用都无法完全实现需求,均会在新用户首次出现时触发KeyError,具体问题分析如下:
两种写法的问题分析
- Method1问题:
当用户名第一次出现在日志中时,外层字典users中不存在对应用户名的键,直接访问users[name]会直接抛出KeyError,进入异常分支无法完成计数。只有当该用户已经存在于外层字典、且内层字典已初始化的前提下,Method1才能对已有分类的计数正确自增。 - Method2问题:
右侧的取值逻辑users.get(name, {}).get(cat, 0) + 1本身是没问题的,就算是新用户、新分类也能算出正确的初始值1,但左侧赋值时依然是users[name][cat],如果外层字典没有对应用户名的键,访问users[name]还是会抛出KeyError,同样无法完成赋值。
正确实现方案
你只需要在计数前先确保外层字典的用户名键存在,且对应值为初始化的空字典即可,建议搭配setdefault方法使用,同时注意你原代码中存在拼写错误:re.serach应为re.search。
修正后的完整代码如下:
#!/usr/bin/env python3 import re users = {} with open('logfile.txt') as f: for line in f: regex_user = r"(INFO|ERROR): .* \((.+)\)$" # 匹配日志级别和对应的用户名 user = re.search(regex_user, line) if user is None: continue name = user[2] cat = user[1] # 确保外层用户键存在,不存在则初始化空字典 users.setdefault(name, {}) # 此时Method1可以正常执行,完成计数自增 users[name][cat] = users[name].get(cat, 0) + 1
运行后即可得到你期望的输出格式:
{'John': {'INFO': 22, 'ERROR': 3}}
内容的提问来源于stack exchange,提问作者StarrDevelops
相关产品推荐
相关产品推荐

