我有以下数据:
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]}
我该怎么做?
答案 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]}