我需要根据两个键对输入字典进行分组,并将每个分组作为字典列表的一部分返回。例如,
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个值压缩在一起,这只是的问题
- 在得到的元组序列上迭代
- 拆包每个元组,以及
- 从解包的值构建期望的密钥/值对
如果对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))}