【问题标题】:Get the count of the values in a nested dictionary获取嵌套字典中值的计数
【发布时间】: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


【解决方案1】:

创建您自己的类,继承 dict 类并添加您需要的计数数组,并让新的添加/删除函数相应地更新它。 添加一个给定键返回计数的函数,这样您就可以获得更新的计数,而不会浪费任何额外的时间,而不是您已经花费在从字典中添加/删除的时间。 有如何继承和覆盖添加/删除函数的示例here

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2016-09-20
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多