You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:09:03