我有一个嵌套列表:
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]]
有办法做到这一点吗?
感谢。
答案 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单行怎么样。
导入和数据:
>>> 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
列0
和1
的{{3}}方法组。结果是GroupBy
个对象。你需要用它“做”一些东西来形象化它。在这里,我们对组中的值求和。也许看一个格式很好的表会变得更加清晰:
MultiIndex(levels=[[1, 3], [2, 3, 4]],
labels=[[0, 0, 1], [0, 1, 2]],
names=[0, 1])
有两个级别,名称为0
和1
。最左边的列是第一个级别,标签为1
和3
,下一个是第二个级别,标签为2
,3
和{{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)