Python中字典中集合的元素
我有一个字典,长这样:
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),其中 n 是 dict1
中所有集合的值的总数。
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_)