我有大约20000个字典。我想找到所有字典中常见的所有密钥(该密钥需要出现在所有20000字典中)字典。我怎样才能实现这一点。目前我正在编写类似的东西,但是它没有给我预期的结果:
if parsedData.keys() not in uniquelist:
uniquelist.append(parsedData.keys())
else:
commonlist.append(parsedData.keys())
这里解析的数据是我的字典。请帮帮我。
答案 0 :(得分:3)
你可以在第一个字典中创建一组键,然后在循环中创建与剩余键的交集:
>>> d1 = {'a':1, 'b':2, 'c':3}
>>> d2 = {'b':4, 'c':7,'d':5}
>>> d3 = {'b':5, 'c':8,'e':6}
>>> dicts = [d1,d2,d3]
>>> common_keys = set(d1.keys())
>>> for d in dicts[1:]:
common_keys.intersection_update(set(d.keys()))
>>> common_keys
{'b', 'c'}
答案 1 :(得分:0)
我会使用Counter
模块中的collections
例如:
from collections import Counter
count = Counter()
for dictionary in listOfAllDictionaries:
count = count+Counter(dictionary)
uniquelist = [key for key in count if count[key] == 1]
commonlist = [key for key in count if count[key] > 1]
答案 2 :(得分:0)
这可能不是最有效的方法,但它只使用常见的,易于理解的运算符和方法。只需创建一个包含所有键的列表,并计算出与词典一样多次显示的键
>>> d1 = {1: 'a', 2: 'b'}
>>> d2 = {3: 'c', 2: 'b'}
>>> dictionaries = [d1, d2]
>>> for d in dictionaries:
keys += list(d.keys())
>>> keys
[1, 2, 2, 3]
>>> commonkeys = []
>>> for k in keys:
if k not in commonkeys and keys.count(k) == len(dictionaries):
commonkeys += [k]
>>> commonkeys
[2]
瞧,词典中的共同关键是2。
答案 3 :(得分:0)
一种Pythonic方式,不一定是最容易理解的方式。尽管如此,这是一个班轮:
>>> d1 = { 'a' : 1, 'b' : 1 }
>>> d2 = { 'a' : 1, }
>>> d3 = { 'a' : 1, 'c' : 1 }
>>> set.intersection(*tuple(set(d.keys()) for d in [d1, d2, d3]))
set(['a'])
与使用计数器和列表的解决方案不同,这应该是非常有效的,而且开销很少,需要经过这么多决策。但是,这确实会构建一个大元组,因此,我怀疑代码的循环效率会更高。
有人提到你可能想要"独特"钥匙也是,但我不确定是什么意思。这是否意味着,只是在一个字典中不常见,或者是否意味着什么?如果它是前者,那么也只保留一个联合的集合,而不是交集,然后在完成后取两者的差异。根据我们所讨论的唯一键的总数,我仍然认为这是一个相对便宜的操作。
编辑: 要回答以下问题:
from collections import defaultdict
all_dicts = [d1, d2, d3]
common = set.intersection(*tuple(set(d.keys()) for d in all_dicts))
common_key_values = defaultdict(list)
for d in all_dicts:
for key in common:
common_key_values.append(d[key])
答案 4 :(得分:0)
捏John Coleman' example dictionaries
d1 = {'a':1, 'b':2, 'c':3}
d2 = {'b':4, 'c':7,'d':5}
d3 = {'b':5, 'c':8,'e':6}
d = [d1, d2, d3]
d = iter(d)
reduce(set.intersection, d, set(next(d)))
set(['c', 'b'])