Python:如果前两个元素相同,则在嵌套列表中添加元素

时间:2016-01-23 08:04:24

标签: python list nested

我有一个嵌套列表:

 a = [[1,2,3,4,5],[1,2,5,6,7],[1,2,5,2,1],[1,3,4,5,7],[3,4,1,2,3],[3,4,1,1,1]]

如果子列表的前两个元素相同,那么我想添加相应的第3,第4和第5个元素,同时保留前两个元素。对于上述情况,结果应为:

a = [[1,2,13,12,13],[1,3,4,5,7],[3,4,2,3,4]]

有办法做到这一点吗?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用字典根据前两项对子列表进行分类,然后迭代这些项并计算总和:

>>> d = {}
>>> for sub in a:
...    d.setdefault(tuple(sub[:2]),[]).append(sub[2:])
... 

>>> 
>>> [k+tuple(map(sum, zip(*v))) for k,v in d.items()]
[(1, 2, 13, 12, 13), (1, 3, 4, 5, 7), (3, 4, 2, 3, 4)]

答案 1 :(得分:2)

Pandas one-liner

pandas单行怎么样。

导入和数据:

>>> import pandas as pd
>>> a = [[1,2,3,4,5],[1,2,5,6,7],[1,2,5,2,1],[1,3,4,5,7],[3,4,1,2,3],[3,4,1,1,1]]

大熊猫在行动:

>>> pd.DataFrame(a).groupby([0, 1]).sum().reset_index().values.tolist()
[[1, 2, 13, 12, 13], [1, 3, 4, 5, 7], [3, 4, 2, 3, 4]]

步骤一步

制作数据框:

>>> df = pd.DataFrame(a)

   0  1  2  3  4
0  1  2  3  4  5
1  1  2  5  6  7
2  1  2  5  2  1
3  1  3  4  5  7
4  3  4  1  2  3
5  3  4  1  1  1

按前两列分组并将其他列相加:

>>> df2 = df.groupby([0, 1]).sum()
>>> df2

      2   3   4
0 1            
1 2  13  12  13
  3   4   5   7
3 4   2   3   4

01的{​​{3}}方法组。结果是GroupBy个对象。你需要用它“做”一些东西来形象化它。在这里,我们对组中的值求和。也许看一个格式很好的表会变得更加清晰:

groupby

此索引为enter image description here

MultiIndex(levels=[[1, 3], [2, 3, 4]],
           labels=[[0, 0, 1], [0, 1, 2]],
           names=[0, 1])

有两个级别,名称为01。最左边的列是第一个级别,标签为13,下一个是第二个级别,标签为23和{{1} }。第一级中的标签4用于前两行。所有其他标签仅用于一行。

展平多指数:

1

转换为列表:

>> df3 = df2.reset_index()

   0  1   2   3   4
0  1  2  13  12  13
1  1  3   4   5   7
2  3  4   2   3   4

答案 2 :(得分:1)

我会创建一个字典,第一对夫妇作为一个键,值将是一个列表或元组:

a=[[1,2,3,4,5],[1,2,5,6,7],[1,2,5,2,1],[1,3,4,5,7],[3,4,1,2,3],[3,4,1,1,1]]

#create empty dict
d = {}

# function for adding list b to lists a
def addlist(a,b): return [a[i]+b[i] for i in range(len(a))]  

# now iter through each item and add to existing or create a new record in dictionary
for i in a:
    d[tuple(i[:2])] = addlist(d.setdefault(tuple(i[:2]),[0,0,0]),i[2:])

#the wanted output would be
[list(k)+v for k,v in d.items()]

答案 3 :(得分:1)

这是itertools.groupby的相对直接的应用。

以下是使用嵌套列表理解的方法。

from itertools import groupby
from operator import itemgetter

a = [[1,2,3,4,5],[1,2,5,6,7],[1,2,5,2,1],[1,3,4,5,7],[3,4,1,2,3],[3,4,1,1,1]]
expected = [[1,2,13,12,13],[1,3,4,5,7],[3,4,2,3,4]]
print(expected)

a = [list(k) + [sum(t) for t in zip(*[u[2:] for u in g])]
    for k, g in groupby(a, itemgetter(0, 1))]
print(a)

<强>输出

[[1, 2, 13, 12, 13], [1, 3, 4, 5, 7], [3, 4, 2, 3, 4]]
[[1, 2, 13, 12, 13], [1, 3, 4, 5, 7], [3, 4, 2, 3, 4]]

请注意,这假设列表a已经具有以相邻的2个元素开头的子列表。如果情况并非如此,则应对其进行排序,例如

a.sort(key=itemgetter(0, 1))

在运行上面的代码之前。

这里基本上是相同的算法分割,以便于阅读和分析。

keyfunc = lambda seq: seq[:2]

a.sort(key=keyfunc)
new_a = []
for k, g in groupby(a, key=keyfunc):
    tails = [u[2:] for u in g]
    sums = [sum(t) for t in zip(*tails)]
    new_a.append(k + sums)

print(new_a)