使用 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_names
和 results
,请使用 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})})
我经常写一些小程序,当他们运行收集统计数据并在最后报告时。我通常将这些统计数据收集在字典中以在最后显示。
我最终像下面的简单示例一样编写这些内容,但我希望有一种更简洁、更 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_names
和 results
,请使用 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})})