我有一个列表列表,每个内部列表都有三个对象。我想对每个子列表的第一个索引(第二个对象)求和,但前提是子列表中的其他两个对象相同。例如:
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 语句无法正常工作。
请您参考如下方法:
你可以使用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']
如果
list_in 的长度超过二,
itertools.groupby 允许更通用的解决方案。
编辑:该解决方案适用于更大的列表:
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 函数被称为“匿名函数”,因为当它的对象被创建时,它没有绑定(bind)到一个名称。相反,函数对象本身被返回。
