Python中字典中集合的元素

0 投票
2 回答
1613 浏览
提问于 2025-04-19 11:12

我有一个字典,长这样:

dict1 = {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5: set([2]), 6: set([])}

我想从这个字典里再创建一个字典,来统计第一个字典中每个键在其他值中出现的次数,也就是说,结果应该是:

result_dict = {0: 1, 1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1}

我写的代码是这样的:

dict1 =  {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5:set([2]), 6: set([])}
result_dict = {}
for pair in dict1.keys():
    temp_dict = list(dict1.keys())

    del temp_dict[pair]
    count = 0
    for other_pairs in temp_dict :
        if pair in dict1[other_pairs]:
            count = count + 1
    result_dict[pair] = count  

这个代码的问题是,当数据量很大时,它运行得非常慢。另一个尝试是用一行代码来写,像这样:

result_dict = dict((key ,dict1.values().count(key)) for key in dict1.keys())  

但这样得到的结果是错的,因为第一个字典的值是集合:

{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}

非常感谢你的帮助!

2 个回答

0

只需要用 dict1 的键创建一个新的字典,初始值设为 0。然后遍历 dict1 中每个集合里的值,随着遍历的进行,逐步增加 result_dict 中对应的值。这个过程的运行时间是 O(n),其中 ndict1 中所有集合的值的总数。

dict1 = {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5:set([2]), 6: set([])}
result_dict = dict.fromkeys(dict1.keys(), 0)
# {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}

for i in dict1.keys():
    for j in dict1[i]: 
        result_dict[j] += 1

print result_dict
# {0: 1, 1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1}
1

我想,首先我会弄清楚有哪些值存在:

all_values = set().union(*dict1.values())

然后我会尝试计算每个值出现了多少次:

result_dict = {}
for v in all_values:
    result_dict[v] = sum(v in dict1[key] for key in dict1)

另一种方法是使用 collections.Counter

result_dict = Counter(v for set_ in dict1.values() for v in set_)

这个方法可能比我最开始的解决方案要“干净”一些——但它涉及到嵌套的理解,可能会有点难以理解。不过,它确实有效:

>>> from collections import Counter
>>> dict1
{0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5: set([2]), 6: set([])}
>>> result_dict = Counter(v for set_ in dict1.values() for v in set_)

撰写回答