Python 返回包含给定字典键的字典';s值,反之亦然

Python 返回包含给定字典键的字典';s值,反之亦然,python,dictionary,Python,Dictionary,在一个函数中,我如何创建一个字典,谁的键是给定字典的值,反之亦然,如果给定字典的每个键都有多个值? 例如,给定一本词典: d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]} 我需要返回一本字典,如: d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]} 我唯一的想法是列出所有值,然后手动检查每个值的每个键,但如果不知道键和值的数量,我就不知道如何做。任何帮助都将不胜感激。易于使

在一个函数中,我如何创建一个字典,谁的键是给定字典的值,反之亦然,如果给定字典的每个键都有多个值? 例如,给定一本词典:

d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}
我需要返回一本字典,如:

d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}

我唯一的想法是列出所有值,然后手动检查每个值的每个键,但如果不知道键和值的数量,我就不知道如何做。任何帮助都将不胜感激。

易于使用的
collections.defaultdict()
默认为
list

  • 在已排序的键/值对上循环
  • 值项上的内部循环
  • 对于每个值项,使用原始dict键创建/更新列表
代码:

结果:

{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
尝试:


说明:
set(d中的字母对应于d中的字母[key])
是原始dict中出现的所有字母的集合。然后我们制作一个新dict,其中每个条目都是
letter:[key for key for key in d if letter in d[key]]]
,表示其中一个字母,映射到原始目录中映射到它的数字列表。

我找到了一个解决方案


这很好,但是有没有简洁的方法可以不用导入模块就可以做到这一点呢?你可以不用
defaultdict
而用普通
dict
替换
d3[vi]。用
d3.setdefault(vi,[]).append(k)
附加(k)
。不需要进口。
{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
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)
{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])}
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']}