返回带有键的字典,用于给定字典的值,反之亦然

时间:2016-12-08 12:38:29

标签: 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"]}

我唯一的想法是列出所有值,然后手动检查每个值的每个键,但我不知道如何在不知道键和值的数量的情况下这样做。任何帮助都将受到极大的赞赏。

4 个答案:

答案 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

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

代码:

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']}