假设我有一组数据对,索引0是值,索引1是类型:
input = [
('11013331', 'KAT'),
('9085267', 'NOT'),
('5238761', 'ETH'),
('5349618', 'ETH'),
('11788544', 'NOT'),
('962142', 'ETH'),
('7795297', 'ETH'),
('7341464', 'ETH'),
('9843236', 'KAT'),
('5594916', 'ETH'),
('1550003', 'ETH')
]
我想按类型(按第一个索引字符串)对它们进行分组,如下所示:
result = [
{
type:'KAT',
items: ['11013331', '9843236']
},
{
type:'NOT',
items: ['9085267', '11788544']
},
{
type:'ETH',
items: ['5238761', '962142', '7795297', '7341464', '5594916', '1550003']
}
]
如何以有效的方式实现这一点
这个答案类似于@PaulMcG's answer,但不需要对输入进行排序
对于那些进入函数式编程的人,
groupBy
可以写在一行中(不包括导入!),与itertools.groupby
不同的是,它不需要对输入进行排序:(在
lambda
中... or grp
的原因是reduce()
要想工作,lambda
需要返回它的第一个参数;因为list.append()
总是返回None
,or
总是返回grp
。也就是说,绕过python的限制,lambda只能对单个表达式求值是一种技巧。)这将返回一个dict,其键是通过计算给定函数找到的,其值是按原始顺序列出的原始项。对于OP的示例,将其称为
groupBy(lambda pair: pair[1], input)
将返回以下命令:根据@PaulMcG's answer,OP请求的格式可以通过将其包装到列表中来找到。这样就可以了:
Python的内置} 函数,但要对要分组的元素进行排序,首先必须使要分组的元素在列表中是连续的:
itertools
模块实际上有一个^{现在输入看起来像:
groupby
返回形式为(key, values_iterator)
的2元组序列。我们想把它变成一个dict列表,其中“type”是键,“items”是值迭代器返回的元组的第0个元素的列表。像这样:现在
result
包含您所需的dict,如您在问题中所述您可能会考虑,只需用一个键入一个单元格,每个值包含值列表。在当前表单中,要查找特定类型的值,必须遍历列表以查找包含匹配“type”键的dict,然后从中获取“items”元素。如果使用单个dict而不是一个1项dict的列表,则可以通过对主dict进行单键查找来查找特定类型的项。使用
groupby
,这将类似于:result
现在包含此dict(类似于@KennyTM答案中的中间res
defaultdict):(如果您想将其减少为一行,您可以:
或者使用最新的dict理解表:
分两步完成。首先,创建一个字典
然后,将该词典转换为预期格式
itertools.groupby也可以这样做,但需要先对输入进行排序
注:这两种情况都不符合钥匙的原始顺序。如果你需要维持订单,你需要一个订单
相关问题 更多 >
编程相关推荐