使用 python 字典保存程序统计信息的简洁方式

Clean way of using a python dictionary to hold program statistics

我经常写一些小程序,当他们运行收集统计数据并在最后报告时。我通常将这些统计数据收集在字典中以在最后显示。

我最终像下面的简单示例一样编写这些内容,但我希望有一种更简洁、更 pythonic 的方法来执行此操作。当有多个指标时,这种方式会变得非常大(或嵌套)。

stats = {} 

def add_result_to_stats(result,func_name):
    if not func_name in stats.keys():
        stats[func_name] = {}
    if not result in stats[func_name].keys():
        stats[func_name][result] = 1
    else:
        stats[func_name][result] += 1

如果您只需要计算 func_namesresults,请使用 Counter

import collections
stats = collections.Counter()

def add_result_to_stats(result,func_name):
    stats.update({(func_name, result):1})

您可以合并 defaultdict with Counter,这会将 add_result_to_stats 减少为一行:

from collections import defaultdict, Counter
stats = defaultdict(Counter)

def add_result_to_stats(result, func_name):
    stats[func_name][result] += 1

add_result_to_stats('foo', 'bar')
print stats # defaultdict(<class 'collections.Counter'>, {'bar': Counter({'foo': 1})})