如何在Python列表中组合两行

时间:2016-06-17 18:36:34

标签: python list

假设我有一个2D列表,

a= [['a','b','c',1],
    ['a','b','d',2],
    ['a','e','d',3],
    ['a','e','c',4]]

我想获得一个列表,如果行中的前两个元素相同,则将第四个元素相加,删除第三个元素并将这些行组合在一起,如下所示,

b = [['a','b',3],
     ['a','e',7]]

最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

如果您的列表已经排序,则可以使用itertools.groupby。按前两个元素分组后,可以使用生成器表达式对第4个元素求和并创建新列表。

>>> from itertools import groupby
>>> a= [['a','b','c',1],
        ['a','b','d',2],
        ['a','e','d',3],
        ['a','e','c',4]]
>>> [g[0] + [sum(i[3] for i in g[1])] for g in groupby(a, key = lambda i : i[:2])]
[['a', 'b', 3],
 ['a', 'e', 7]]

答案 1 :(得分:1)

使用pandas' s groupby

import pandas as pd
df = pd.DataFrame(a)
df.groupby([0, 1]).sum().reset_index().values.tolist()

输出:

df.groupby([0, 1]).sum().reset_index().values.tolist()
Out[19]: [['a', 'b', 3L], ['a', 'e', 7L]]

答案 2 :(得分:0)

您可以使用pandas groupby方法来实现这一目标。

import pandas as pd

a= [['a','b','c',1],
    ['a','b','d',2],
    ['a','e','d',3],
    ['a','e','c',4]]

df  = pd.DataFrame(a)
df_sum = df.groupby([0,1])[3].sum().reset_index()
array_return = df_sum.values
list_return = array_return.tolist()
print(list_return)

list_reuturn是你想要的结果。

答案 3 :(得分:0)

如果你有兴趣。这是一个使用原始python的实现。我只在您提供的数据集上测试过它。

a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]

b_dict = {}
for row in a:
    key = (row[0], row[1])
    b_dict[key] = b_dict[key] + row[3] if key in b_dict else row[3]
b = [[key[0], key[1], value] for key, value in b_dict.iteritems()]