在python中使用for循环汇总列表中的元素

在python中使用for循环汇总列表中的元素,python,list,loops,for-loop,numbers,Python,List,Loops,For Loop,Numbers,在编写一个用列表中的一组数字创建条形图的程序时,我发现将列表中的项目相加不起作用。我认为最好的方法就是做一个for循环 以下是我的清单: phonelist = [[12,14,16,17,18],[16,23,54,64,32]] 然后我试着用一个for循环把这个加起来 numphone = 0 for x in len(phonelist[0]): numphone = numphone + x 但我得到了这个错误: TypeError:“int”对象不可编辑 我该怎么办?len

在编写一个用列表中的一组数字创建条形图的程序时,我发现将列表中的项目相加不起作用。我认为最好的方法就是做一个
for
循环

以下是我的清单:

phonelist = [[12,14,16,17,18],[16,23,54,64,32]]
然后我试着用一个
for
循环把这个加起来

numphone = 0
for x in len(phonelist[0]):
    numphone = numphone + x
但我得到了这个错误:

TypeError:“int”对象不可编辑

我该怎么办?

len(电话列表[0])
是一个int,所以不能循环使用它。你可以把它改成

for x in phonelist[0]:
这样,
x
将接受
电话列表[0]
的每个值

>>> phonelist = [[12,14,16,17,18],[16,23,54,64,32]]
>>> [sum(li) for li in phonelist]
[77, 189]
>>> sum([sum(li) for li in phonelist])
266
或:

如果您试图创建单个类别,可以使用dict:

data={'Bar {}'.format(i):sum(li) for i, li in enumerate(phonelist, 1)}
data['Total']=sum(data.values())

print data
{'Bar 2': 189, 'Bar 1': 77, 'Total': 266}
然后,如果要生成简单的条形图:

for bar in sorted(data.keys()):
    print '{}: {}'.format(bar, int(round(25.0*data[bar]/data['Total']))*'*')
印刷品:

Bar 1: *******
Bar 2: ******************
Total: *************************

这应该行得通。您可以遍历列表,而不是遍历列表的长度,因为长度是一个整数,遍历整数没有意义

最好的解决方案是使用。在这个问题的其他答案中给出的一种方法是对每个汇总表求和,然后对这些小计求和

然而,一个更好的解决方案是将子列表展平-这最好通过以下方法实现

这是一个最佳解决方案,因为这意味着您不必执行许多单独的求和操作,也不必创建中间列表。如果您的数据是惰性源,那么它也会惰性地工作,从而提高代码的内存效率并分散处理负载。

当然,这是一种更具python风格的方法来完成您试图完成的任务。
Bar 1: *******
Bar 2: ******************
Total: *************************
numphone = 0
for x in phonelist[0]:
    numphone = numphone + x
sum(itertools.chain.from_iterable(phonelist))