这是一小段Python代码,用于添加嵌套列表的元素:
def nested_sum(lists):
s = [0,0,0,0,0,0,0,0] # If I delete this line then an error is given
for i in range(len(lists)):
s[i] = sum(lists[i])
print sum(s)
lists = [[1],[1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6] ]
nested_sum(lists)
请原谅格式化。
此代码的问题在于我评论的行。
显示的错误是:
NameError: global name 's' is not defined
如果不在之前声明列表s
,我该如何避免此错误?
答案 0 :(得分:3)
如果删除标记的行,则会得到NameError
,因为在定义该名称应引用的内容之前,您尝试索引某些内容(s
)。这应该是清楚的。
一次性解决问题的最简单方法是将{(1}}生成器与sum
中的chain
函数结合使用(取决于您的偏好)。
没有itertools
:
chain
使用>>> lists = [[1],[1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6] ]
>>> sum(value for sublist in lists for value in sublist)
56
:
chain
相当于
>>> from itertools import chain
>>> sum(chain(*lists))
56
答案 1 :(得分:2)
您可以将for循环转换为oneliner,这样您就不必预先声明变量s
。这是代码:
def nested_sum(lists):
s = [sum(lists[i]) for i in range(len(lists))] #converted for loop to oneliner
print sum(s)
lists = [[1],[1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6] ]
nested_sum(lists)
答案 2 :(得分:1)
在这种情况下,您始终必须声明列表。但你可以选择如何。例如:
1)s = [0] * len(lists)
- 将等于您的声明
2)s = []
,接下来你做这样的事情:
for i in range(len(lists)):
s.append(sum(lists[i]))
答案 3 :(得分:1)
特别是在您的情况下,您实际上并不需要s
来实现相同的功能(如果您不介意更改lists
的内容):
def nested_sum(lists):
for i in range(len(lists)):
lists[i] = sum(lists[i])
print sum(lists)
>>> lists = [[1],[1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6] ]
>>> nested_sum(lists)
56
答案 4 :(得分:1)
另一种方法是使用变量来存储总和而不是列表,并使用' in'要遍历列表项而不是范围的关键字:
DB::table('logs')->first()
答案 5 :(得分:1)
根据Lol4t0的评论,您不需要任何中间列表(也没有额外的内存)
def nested_sum(lists):
print sum(sum(l) for l in lists)
我使用的语法是generator expression。
当然,使用print
,
def nested_sum(lists):
return sum(sum(l) for l in lists)
然后像这样使用它
l = [[1],[1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6] ]
print nested_sum(l)
答案 6 :(得分:0)
有一种更短更多的pythonic方法:
>>> lists = [[2,4], [1]]
>>> [sum(x) for x in lists]
输出: [6,1]
您可以进一步阅读列表理解