我正在将所有嵌套列表中的元素相加,目前为止我已经有:
for i in range(len(b)) :
for j in range(len(b[i])):
total = total + b[i][j]
但是,当嵌套列表中存在整数值时,这种方法将不起作用,例如:
b = [[1,2], [3,4], [5,6], 1]
在这种情况下,我收到了一个错误消息,指出类型为“int”的对象没有长度(len())。 在这种情况下应该怎么做?
我正在将所有嵌套列表中的元素相加,目前为止我已经有:
for i in range(len(b)) :
for j in range(len(b[i])):
total = total + b[i][j]
b = [[1,2], [3,4], [5,6], 1]
首先,您展示了Python程序员常见的反模式,不要循环索引,而是循环对象本身。例如:
for item in b:
do_something(item)
不要这样写:
for i in range(len(b)):
do_something(b[i])
它更清晰、简单和快速。
话虽如此,您遇到的主要问题是其中一个项目不是列表,因此它没有长度。
在这里更好的选择是使用生成器表达式和 itertools.chain.from_iterable()
扁平化列表,然后使用内置函数 sum()
来计算元素的总和。
>>> import collections
>>> import itertools
>>> b = [[1,2], [3,4], [5,6], 1]
>>> list(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
[1, 2, 3, 4, 5, 6, 1]
>>> sum(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
22
itertools.chain()
无法处理非可迭代项,因此我们将任何内容放入列表中以解决这个问题。def chain_mixed(iterable):
for item in iterable:
try:
for subitem in item:
yield subitem
except TypeError:
yield item
sum(chain_mixed(b))
item if isinstance(item, collections.Iterable) else [item]
。 - Jon Clementslist
或tuple
时使用sum()
,否则直接使用数字。>>> b = [[1,2], [3,4], [5,6], 1]
>>> sum(sum(x) if isinstance(x,(list,tuple)) else x for x in b)
22
优化您的解决方案:
total=0
b = [[1,2], [3,4], [5,6], 1]
for i in range(len(b)) :
if isinstance(b[i],(list,tuple)):
for j in range(len(b[i])):
total += b[i][j]
else:
total +=b[i]
print total #prints 22
b= [[1,2,[1]],[3,4],[5,6],1]
),它仍然会失败。 - Joran Beasley>>> b = [[1,2], [3,4], [5,6], 1]
>>> def sum_up(x):
... for i in x:
... if isinstance(i, int):
... yield i
... else:
... for j in sum_up(i):
... yield j
...
>>> sum(sum_up(b))
22
>>> b = [[1,2], [3,4], [5,6,[3,[6,7]]], 1]
>>> sum(sum_up(b))
38
如果列表包含嵌套列表和整数/浮点数,这种方法将起作用。 在这里,我使用了Python内置函数'sum'来添加列表的所有元素。
def add(nested_list):
temp=[]
for i in nested_list:
if isinstance(i,list):
temp.append(sum(i))
else:
temp.append(i)
print sum(temp)
def calc_sum(the_list):
sum = 0
for item in the_list:
if isinstance(item,(list,tuple)):
sum += calc_sum(item)
else:
sum += item
return sum
虽然不太符合Python的风格...但应该能正常工作