如何获取字典中嵌套值的键数?

问0ne

我有一本字典,其中的键具有相同的值。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章