使用条件检查对嵌套列表中的元素求和

时间:2018-01-30 21:21:31

标签: python list nested

我列出了一个列表,每个内部列表都有三个对象。我想对每个子列表的第一个索引(第二个对象)求和,但前提是子列表中的其他两个对象是相同的。例如:

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

然而,这只是给了我与我开始时相同的列表。显然,ifelif语句无法正常运行。

2 个答案:

答案 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']]

这还将包括没有重复条目的任何子列表。不确定是否可以。