如何在列表列表中求和元组的第二个元素?

时间:2019-02-18 16:42:37

标签: python

我有一个名为allBins的列表列表,其中包含几个表示不同bin的列表,在这些bin中是数量不等的元组,其格式为(iD,volume)。我需要通过对元组的第二个元素求和来进行迭代,以对每个箱中的项目量求和。

我尝试了很多事情: sum(bin[1] for bin in allBins)提示我“列表索引超出范围”错误,可能是因为某些垃圾箱有多个元组吗?

allBins = [[(3,20)],[(1,11),(0,6)],[(4,16),(2,5)]]

我需要一行代码,这取决于我选择求和的那个箱,它为我提供以下整数:

第一容器:20

第二个bin:17

第3个垃圾箱:21

6 个答案:

答案 0 :(得分:5)

您可以使用列表理解:

allBins = [[(3,20)],[(1,11),(0,6)],[(4,16),(2,5)]]

print([sum(y[1] for y in x) for x in allBins])
# [20, 17, 21]

处理您的实际需求:“我需要某种循环或理解,这取决于我选择求和的那个仓”。

allBins = [[(3,20)],[(1,11),(0,6)],[(4,16),(2,5)]]

bin_number = 2
print(sum(x[1] for x in allBins[bin_number-1]))
# 17

您可以指定bin_number,上面的代码会找到该特定bin的总和。

答案 1 :(得分:2)

您遇到的问题是您只想对一个仓位求和,但是您试图对所有仓位求和。这意味着当您访问第一个bin,其值为[(3,20)]并要求索引为1的元素时,只有一个索引为0的元素,并且您会遇到越界错误。

您想要这样的东西:

def sum_bin(bin_num, data):
    my_bin = data[bin_num]
    return sum(t[1] for t in my_bin)

>>> sum_bin(0, allBins)
20
>>> sum_bin(1, allBins)
17
>>> sum_bin(2, allBins)
21

作为“一个班轮”,假设您有一个捕获所需垃圾箱的变量

sum(t[1] for t in allBins[bin_idx])

这称为generator comprehension,尽管它与列表理解相似,但存在细微差别。

答案 2 :(得分:2)

您接近了:-)只需将您给出的求和片段放入list comprehension内,以使每个bin运行一次求和。

FWIW,您也可以使用operator.itemgetter()获得美观,实用的方法:

long

读为“为所有bin中的每个bin求和的列表”,其中的总和是“ bin中每个元组中的第一个项的和”。

答案 3 :(得分:1)

遍历主列表后,您可以使用sum来累加整数。

allBins = [[(3,20)],[(1,11),(0,6)],[(4,16),(2,5)]]

def sumup(which, allBins):
    return sum(tup[1] for tup in allBins[which])

print(sumup(1, allBins))

文档:sum built-in

答案 4 :(得分:0)

for c,b in enumerate(allBins):
    if c == bin_you_choose_to_sum:
        partial=0
        for t in b:
            partial+=t[1]
        print("Bin {}: {}".format(c, partial))

答案 5 :(得分:0)

您可以使用以下功能:

from operator import itemgetter

allBins = [[(3,20)],[(1,11),(0,6)],[(4,16),(2,5)]]

def func(bin_num, all_bins):
    bin = itemgetter(bin_num)(all_bins)
    s = sum(map(itemgetter(-1), bin))
    return s

print(func(2, allBins))
# 21