使用列表作为值的Python字典,查找具有相同值的其他键

时间:2018-10-06 19:34:13

标签: python list dictionary

说我有以下字典。

>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}

我想找到一种方法来查看每个键的值,并返回值列表中是否包含重复变量。

例如,它将输出:

>> [["1","3"] , ['a']]

我已经看过这里的一些帖子,并尝试使用和/或更改它们以实现此目的,但是我发现的任何内容均未按预期工作。如果满足以下条件,它们将起作用:

>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['a','b','c']}

但如果列表中只有一个值相同,则不会。

4 个答案:

答案 0 :(得分:3)

您可以使用另一个字典将值映射到相应键的列表。然后只需选择映射到多个键的值即可,例如:

from collections import defaultdict

sample_dict = {'1': ['a','b','c'], '2': ['d','e','f'], '3': ['g','h','a']}    

d = defaultdict(list)  # automatically initialize every value to a list()

for k, v in sample_dict.items():
    for x in v:
        d[x].append(k)

for k, v in d.items():
    if len(v) > 1:
        print([v, k])

输出:

[['1', '3'], 'a']

答案 1 :(得分:2)

如果列表元素是可哈希的,则可以使用.setdefault来构建逆映射,如下所示:

>>> sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}
>>> aux = {}
>>> for k, v in sample_dict.items():
...     for i in v:
...         aux.setdefault(i, []).append(k)
... 
>>> [[v, k] for k, v in aux.items() if len(v) > 1]
[[['1', '3'], 'a']]

答案 2 :(得分:2)

字典从键映射到值,而不是从值映射到键。但是,您可以编写一个用于一次性计算的函数。这会产生O( n )时间复杂度,不建议用于较大的词典:

def find_keys(d, val):
    return [k for k, v in d.items() if val in v]

res = find_keys(sample_dict, 'a')  # ['1', '3']

如果您经常这样做,建议您通过collections.defaultdict“反转”字典:

from collections import defaultdict

dd = defaultdict(list)

for k, v in sample_dict.items():
    for w in v:
        dd[w].append(k)

print(dd)

defaultdict(<class 'list'>, {'a': ['1', '3'], 'b': ['1'], 'c': ['1'], 'd': ['2'],
                             'e': ['2'], 'f': ['2'], 'g': ['3'], 'h': ['3']})

这会花费O( n )进行反转,以及增加额外的内存,但是现在允许您在O(1)时间内访问与输入值关联的键,例如dd['a']将返回['1', '3']

答案 3 :(得分:0)

您可以使用defaultdict模块中的collections来完成此操作

例如,

from collections import defaultdict
sample_dict = {"1": ['a','b','c'], "2": ['d','e','f'], "3": ['g','h','a']}

d = defaultdict(list)
for keys, vals in sample_dict.items():
    for v in vals:
        d[v].append(keys)


print(d)

d将返回dict,其中键将是重复的值,而值将是在其中重复它们的列表。

以上代码的输出为defaultdict(list,{'a': ['1', '3'],'b': ['1'],'c': ['1'],'d': ['2'],'e': ['2'],'f': ['2'],'g': ['3'],'h': ['3']})

虽然可以使用希望输出的格式,但是一般不建议这样做,因为我们试图让哪个字符在哪个列表中重复出现,这就像字典的工作 >