查找许多词典的常用键

时间:2015-10-10 01:44:44

标签: python dictionary

我有大约20000个字典。我想找到所有字典中常见的所有密钥(该密钥需要出现在所有20000字典中)字典。我怎样才能实现这一点。目前我正在编写类似的东西,但是它没有给我预期的结果:

if parsedData.keys() not in uniquelist: 
            uniquelist.append(parsedData.keys())
        else:
            commonlist.append(parsedData.keys())

这里解析的数据是我的字典。请帮帮我。

5 个答案:

答案 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'])