我有一个列表,如下所示
[['H1','L', '1']
['H1','S', '1']
['H2','L', '1']
['H2','L', '1']]
并希望基于column1和column2进行分组。 python是否在列表中提供了我可以获得以下结果的任何内容
H1 L 1
H1 S 1
H2 L 2
答案 0 :(得分:4)
您可以使用itertools.groupby
,并将每个组的最后一列相加。
from itertools import groupby
out = []
for k, v in groupby(l, key=lambda x: x[:2]):
s = sum([int(x[-1]) for x in v])
out.append(k + [s])
print (out)
# [['H1', 'L', 1], ['H1', 'S', 1], ['H2', 'L', 2]]
答案 1 :(得分:4)
您可以使用itertools.groupby
和operator.itemgetter
来获得所需的结果
>>> from operator import itemgetter
>>> from itertools import groupby
>>> items = [['H1','L', '1'], ['H1','S', '1'], ['H2','L', '1'], ['H2','L', '1']]
>>> [(*k,sum([int(itemgetter(2)(i)) for i in list(g)])) for k,g in groupby(items,key=itemgetter(0,1))]
>>> [('H1', 'L', 1), ('H1', 'S', 1), ('H2', 'L', 2)]
答案 2 :(得分:1)
另一个选择是使用pandas:
import pandas as pd
df = pd.DataFrame([['H1','L', 1],['H1','S', 1],['H2','L', 1],['H2','L', 1]],columns=['H','LS','1'])
df.groupby(['H','LS']).sum()
返回
1
H LS
H1 L 1
S 1
H2 L 2
或
>>> df.groupby(['H','LS']).sum().reset_index()
H LS 1
0 H1 L 1
1 H1 S 1
2 H2 L 2
答案 3 :(得分:0)
使用itertools groupby
和自定义键获取所需的列:
groupby(l, key = lambda x: (x[0], x[1]) )
这里有一个与此代码对应的live example:
l = [
['H1','L', '1'],
['H1','S', '1'],
['H2','L', '1'],
['H2','L', '1']
]
import itertools as it
for k, v in it.groupby(l, key = lambda x: (x[0], x[1]) ):
print(list(v)[0])
结果:
['H1', 'L', '1']
['H1', 'S', '1']
['H2', 'L', '1']
答案 4 :(得分:0)
以下代码有效,
items = [['H1','L', '1'],
['H1','S', '1'],
['H2','L', '1'],
['H2','L', '1']]
from collections import defaultdict
dictionary = defaultdict(int)
for item in items:
dictionary[tuple(item[:2])]+=int(item[2])
for key in dictionary:
print(key[0], key[1], dictionary[key])
答案 5 :(得分:0)
您可以使用哈希对象来存储和查找。这应该很快。
test=[['H1','L', '1'],
['H1','S', '1'],
['H2','L', '1'],
['H2','L', '1']]
d = {}
for x, y, z in test:
d[(x, y)] = d.get((x,y), 0) + 1
print(d)
# -> {('H1', 'L'): 1, ('H1', 'S'): 1, ('H2', 'L'): 2}