在一个函数中,我如何创建一个字典,其中的键是给定字典的值,反之亦然,其中给定的字典每个键有多个值? 例如,给定一个字典:
d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}
我需要返回一个字典,如:
d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}
我唯一的想法是列出所有值,然后手动检查每个值的每个键,但我不知道如何在不知道键和值的数量的情况下这样做。任何帮助都将受到极大的赞赏。
答案 0 :(得分:2)
尝试:
{letter: [key for key in d if letter in d[key]] for letter in set(letter for key in d for letter in d[key])}
说明:set(letter for key in d for letter in d[key])
是原始字典中出现的所有字母的集合。然后我们创建一个新的dict,其中每个条目都是letter: [key for key in d if letter in d[key]]
,这意味着其中一个字母,映射到原始字典中映射到它的数字列表。
答案 1 :(得分:1)
轻松使用collections.defaultdict()
,默认为list
代码:
import collections
d3 = collections.defaultdict(list)
for k,v in sorted(d.items()):
for vi in v:
d3[vi].append(k) # create list or append to existing list
print(dict(d3))
结果:
{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
答案 2 :(得分:0)
data = [(key, value) for key, values in d.items() for value in values]
d2 = defaultdict(list)
for value, key in data:
d2[key].append(value)
print(key, value)
答案 3 :(得分:0)
以下是我找到5 years ago
的解决方案from operator import itemgetter
from itertools import groupby
d = {'1': ['a', 'c'],'2': ['a', 'b', 'c'], '3': ['b']}
d2 = {x: [t[1] for t in group] for (x, group) in groupby(sorted(((j, k) for k, v in d.items() for j in v), key=itemgetter(0)), key=itemgetter(0))}
# {'a': ['1', '2'], 'c': ['1', '2'], 'b': ['2', '3']}