说我有以下字典。
>> 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']}
但如果列表中只有一个值相同,则不会。
答案 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']})
虽然可以使用希望输出的格式,但是一般不建议这样做,因为我们试图让哪个字符在哪个列表中重复出现,这就像字典的工作
>