如何按其中一个键对dict进行分组

  • 本文关键字:dict 一个 何按其 python
  • 更新时间 :
  • 英文 :


我需要根据两个键对输入字典进行分组,并将每个分组作为字典列表的一部分返回。例如,

data = {
'name': ['A', 'C', 'B', 'B'],
'tag': [13, 26, 13, 3],
'id': [234, 235, 236, 237],
'values': [[1, 3, 3], [1, 2, 1], [1, 2, 3], [1, 1, 1]],
}

我可以很容易地使用defaultdict进行子集设置并返回dict的一个键。例如,这将返回按data['name']:分组的dict列表

如果不使用panda(数据集太大(,我如何按一个或多个标签(比如by=['name', 'tag'](分组并返回dict列表?

编辑:预期输出可以是dicts:的列表

[
{'name': 'A', tag: 13, 'id': 234, 'values': [1, 3, 3]}, 
{'name': 'C', tag: 26, 'id': 235, 'values': [1, 2, 1]},
{'name': 'B', tag: 13, 'id': 236, 'values': [1, 2, 3]},
{'name': 'B', tag:  3, 'id': 237, 'values': [1, 1, 2]}
]

或一条或多条:

{
('A', 13): {'id': 234, 'values': [1, 3, 3]}, 
('C', 26): {'id': 235, 'values': [1, 2, 1]},
('B', 13): {'id': 236, 'values': [1, 2, 3]},
('B',  3): {'id': 237, 'values': [1, 1, 2]}
}

这实际上比看起来容易得多:

{(n, t): {'id': i, 'values': vs} for n, t, i, vs in zip(*data.values())}

一旦你把4个值压缩在一起,这只是的问题

  1. 在得到的元组序列上迭代
  2. 拆包每个元组,以及
  3. 从解包的值构建期望的密钥/值对

如果对data.values()返回4个list值的顺序有任何顾虑,可以更明确地说:

from operator import itemgetter
# g(data) == (data['name'], data['tag'], data['id'], data['values'])
g = itemgetter('name', 'tag', 'id', 'values')
result = {(n, t): {'id': i, 'values': vs} for n, t, i, vs in zip(*g(data))}

最新更新