【发布时间】:2014-09-08 14:42:53
【问题描述】:
我有一个这样的嵌套字典:
from collections import defaultdict, OrderedDict
dict = defaultdict(lambda:OrderedDict())
dict[1]['ab'] = 2343
dict[1]['ac'] = 6867
dict[1]['ad'] = 2345
dict[2]['sa'] = 2355
dict[2]['sg'] = 4545
dict[2]['sf'] = 2445
dict[3]['df'] = 9988
我想要每个键的值的计数。每个项目的计数将通过算法运行,以确定下一个值需要添加/删除的位置。现在我有这个:
count = {}
for k, v in dict.items():
count[k] = len(v)
缩放在这里很重要,因为我正在处理非常大的数据库。每次我对字典做某事时,我都必须计数,如果我访问它一百万次,我每次都必须创建count。有没有更有效/pythonic的方法来做到这一点?可以创建一个类似于this 的自定义类,在创建/删除每个项目时对其进行计数?
【问题讨论】:
-
请注意,您可以只使用
d = defaultdict(OrderedDict),并且不应调用您自己的对象dict。鉴于len(d)是O(1),为什么要缓存长度? -
@jonrsharpe 好点。我只是在想如果有大约 10K 项,那么我每次都必须进行
O(10k)操作,这就是我担心的原因。 -
不清楚您使用计数的目的是什么,或者为什么每次都重新计算整个事情。您可以在更改
d[k]时更新count[k],或者如果您不经常需要它,只需创建整个sum(map(len, d.items()))。 -
@jonrsharpe 添加了对计数需要的解释。是的,我可以保留一个变量
count[k]并每次更新它,但问题是我需要一个全局/公共变量,当程序变大时,每次在不同的地方更新计数会使代码变得丑陋/不可读/错误-容易。 -
在这种情况下,一个自定义对象(
dict子类,或者只是dict类似)在您进行时跟踪这些计数可能是最好的选择。
标签: python dictionary counter