我有一本字典,其中的键具有相同的值。
products = {
1: {1:1, 2:2, 3:3},
2: {1:1, 2:2, 3:3},
3: {1:1, 2:2, 3:3},
4: {1:2, 2:3, 3:4}
}
我正在寻找最快的方法来获取它们的计数,而无需进入两个 for 循环来比较它们(因为我正在使用 10000+ 个这样的键值对)
{1:1, 2:2, 3:3}: 3
{1:2, 2:3, 3:4}: 1
我能找到的唯一解决方案是使用,collection.Counter
但由于它是嵌套字典,因此不起作用。我可以用一个列表来代替,但它并没有真正的帮助。
你可以把字典变成他们项目的冻结集。这些是可散列的,因此您可以使用Counter
:
from collections import Counter
ctr = Counter(frozenset(d.items()) for d in products.values())
for k, v in ctr.items():
print(dict(k), v)
输出:
{1: 1, 3: 3, 2: 2} 3
{2: 3, 1: 2, 3: 4} 1
基准测试结果(在线尝试!):
2.586 s U12_Forward
0.007 s dont_talk_just_code
基准代码:
from timeit import timeit
from collections import Counter
def U12_Forward(products):
x = [*products.values()]
return [(dct, x.count(dct)) for dct in products.values()]
def dont_talk_just_code(products):
ctr = Counter(frozenset(d.items()) for d in products.values())
return [(dict(k), v) for k, v in ctr.items()]
funcs = U12_Forward, dont_talk_just_code
products = {
1: {1:1, 2:2, 3:3},
2: {1:1, 2:2, 3:3},
3: {1:1, 2:2, 3:3},
4: {1:2, 2:3, 3:4}
}
products = {i+k: v for k, v in products.items() for i in range(0, 10000, 4)}
for _ in range(3):
for func in funcs:
t = timeit(lambda: func(products), number=1)
print('%.3f s ' % t, func.__name__)
print()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句