从字典到反向字典的字典理解

时间:2019-06-17 11:52:51

标签: python-3.x list dictionary

我有以下数据:

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data':243}}

我想把它转过来,以便键是值,而数据值是键。因此,首先尝试:

b = dict(map(lambda id: (a[id]['data'], id, a))

但是当我这样做时,1被4覆盖,所以结果将是:

{243: 4, 253: 2}

所以我想得到的是这样的结构:

{243: [1, 4], 253: [2]}

我该怎么做?

2 个答案:

答案 0 :(得分:3)

我认为以下代码更易于理解,并且可以更简单地解决您的问题。

from collections import defaultdict

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data':243}}

result = defaultdict(list)
for k, v in a.items():
    result[v['data']].append(k)

print(result)

输出:

defaultdict(<class 'list'>, {243: [1, 4], 253: [2]})

答案 1 :(得分:1)

这可以通过dict理解和itertools.groupby()来完成,但是由于没有对dict进行排序,因此我们必须使用排序列表,因为groupby需要预排序的输入。

from itertools import groupby

a = {1: {'data': 243}, 2: {'data': 253}, 4: {'data': 243}}

# key extractor function suitable for both sorted() and groupby()
keyfunc = lambda i: i[1]['data']

{g[0]: [i[0] for i in g[1]] for g in groupby(sorted(a.items(), key=keyfunc), key=keyfunc)}

这里g是一个分组元组(key, items),其中

  • g[0]keyfunc提取的任何内容(在这种情况下为'data'值),并且
  • g[1]是dict项(即(key, value)元组)上的可迭代项,因此,附加的列表理解仅提取键。

结果:

{243: [1, 4], 253: [2]}