我有一个名为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
答案 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