我列出了一个列表,每个内部列表都有三个对象。我想对每个子列表的第一个索引(第二个对象)求和,但前提是子列表中的其他两个对象是相同的。例如:
list_in = [['aa', 2, 'bb'], ['aa', 2, 'bb']]
由于'aa'
和'bb'
相同,我想将2和2添加到4,并将其输出到新列表中:
list_out = ['aa', 4, 'bb']
所以我需要if
声明。我尝试了以下内容:
list_out = []
if i[0]==i[0] for i in list_in:
total = [sum(list_in[1]) for i in range(len(list_in))]
list_out.append(i[0], total, i[2])
但是python给了我一个InvalidSyntax
错误。我不确定如何解决这个问题。
然后我尝试根据以下条件构建一个新列表:如果第一个和第三个对象相同,则对第二个对象求和:
list_out, total = [], 0
for i in list_in: # "i" is a list within the "list_in" list.
x, y, z = i[0], i[1], i[2]
if x not in list_out and z not in list_out:
list_out.append([x, y, z])
elif x in list_out and z in list_out:
total_y += y
list_out.append([x, total_y, z])
return list_out
然而,这只是给了我与我开始时相同的列表。显然,if
和elif
语句无法正常运行。
答案 0 :(得分:4)
您可以使用itertools.groupby
:
import itertools
list_in = [['aa', 2, 'bb'], ['aa', 2, 'bb']]
new_list = [(a, list(b)) for a, b in itertools.groupby(sorted(list_in, key=lambda x:(x[0], x[-1])), key=lambda x:(x[0], x[-1]))]
final_data = [[a, sum(c[1] for c in d), b] for (a, b), d in new_list][0]
输出:
['aa', 4, 'bb']
如果itertools.groupby
的长度超过两个, list_in
允许更通用的解决方案。
编辑:该解决方案适用于较大的列表:
list_in = [['aa', 2, 'bb'], ['aa', 2, 'bb'], ['aa', 15, 'bb']]
new_list = [(a, list(b)) for a, b in itertools.groupby(sorted(list_in, key=lambda x:(x[0], x[-1])), key=lambda x:(x[0], x[-1]))]
final_data = [[a, sum(c[1] for c in d), b] for (a, b), d in new_list][0]
输出:
['aa', 19, 'bb']
在Python中,函数是一个对象。 lambda
函数称为“匿名函数”,因为在创建其对象时,它不会绑定到名称。而是返回函数对象本身。
答案 1 :(得分:1)
我认为我正在手动执行Ajax1234对groupby所做的事情,其中包括:
list_in = [['aa', 2, 'bb'], ['aa', 2, 'bb']]
grp = {}
for inner in list_in:
key = (inner[0],inner[-1]) # tuple is immutable and can be key
grp.setdefault(key,0) # create key if needed with value 0
grp[key]+=inner[1] # add value
list_out = [[k[0],grp[k],k[1]] for k in grp] # reassemble from dictionary
print(list_out)
输出:
[['aa', 4, 'bb']]
这还将包括没有重复条目的任何子列表。不确定是否可以。