假设我有一组数据对,其中index 0是值,index 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']
}
]
我怎样才能有效地做到这一点?
Python的内置} 函数,但要使要分组的元素在列表中连续,必须首先对其进行排序:
itertools
模块实际上有一个^{现在输入如下:
groupby
返回一个2元组序列,其形式为(key, values_iterator)
。我们想要的是将其转换成一个dict列表,其中“type”是键,“items”是值迭代器返回的元组的第0个元素的列表。像这样:现在
result
包含您想要的dict,如您在问题中所述。不过,您可以考虑,只需在此基础上生成一个dict,按类型设置键,并且每个值都包含值列表。在当前表单中,若要查找特定类型的值,必须遍历列表以查找包含匹配“type”键的dict,然后从中获取“items”元素。如果使用单个dict而不是一个单项目dict列表,则可以通过对主dict的单键查找来查找特定类型的项。使用
groupby
,这看起来像:result
现在包含这个dict(这类似于@KennyTM的答案中的中间res
defaultdict):(如果要将其减少为一行,可以:
或者使用新的单词理解形式:
分两步做。首先,创建一个字典。
然后,将该词典转换为预期格式。
也可以使用itertools.groupby,但它要求首先对输入进行排序。
注意,这两种方法都不遵守钥匙的原始顺序。如果你需要维持秩序,你需要一份订单。
我也喜欢熊猫简单的grouping。它功能强大,简单,最适合大型数据集
result = pandas.DataFrame(input).groupby(1).groups
相关问题 更多 >
编程相关推荐