在 Python 中声明列表时出错
Error when declaring list in Python
这是一小段 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
之前避免此错误?
在这种情况下,您始终必须声明列表。但你可以选择如何。例如:
1) s = [0] * len(lists)
- 将等于您的声明
2) s = []
,接下来你做这样的事情:
for i in range(len(lists)):
s.append(sum(lists[i]))
您可以将 for 循环转换为单行代码,这样您就不必预先声明变量 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)
特别是在您的情况下,您实际上不需要 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
如果您删除标记的行,您会得到一个 NameError
,因为您在定义该名称应引用的内容之前尝试索引到某些内容 (s
)。应该说清楚了。
一次解决问题的最简单方法是给我们一个生成器表达式与 sum
结合使用或不使用 itertools
中的 chain
函数(取决于您的偏好).
没有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
相当于
>>> sum(chain.from_iterable(lists))
56
另一种方法是使用变量来存储总和而不是列表,并使用 'in' 关键字遍历列表项而不是范围:
def nested_sum(lists):
list_sum = 0
for i in lists:
list_sum += sum(i)
print (list_sum)
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)
你不需要任何中间列表(也不需要额外的内存,根据 Lol4t0 的评论)
def nested_sum(lists):
print sum(sum(l) for l in lists)
我使用的语法是 generator expression.
当然声明你的函数 w/o 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)
有一种更短、更像 Python 的方法:
>>> lists = [[2,4], [1]]
>>> [sum(x) for x in lists]
输出:
[6, 1]
您可以进一步阅读列表理解
这是一小段 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
之前避免此错误?
在这种情况下,您始终必须声明列表。但你可以选择如何。例如:
1) s = [0] * len(lists)
- 将等于您的声明
2) s = []
,接下来你做这样的事情:
for i in range(len(lists)):
s.append(sum(lists[i]))
您可以将 for 循环转换为单行代码,这样您就不必预先声明变量 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)
特别是在您的情况下,您实际上不需要 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
如果您删除标记的行,您会得到一个 NameError
,因为您在定义该名称应引用的内容之前尝试索引到某些内容 (s
)。应该说清楚了。
一次解决问题的最简单方法是给我们一个生成器表达式与 sum
结合使用或不使用 itertools
中的 chain
函数(取决于您的偏好).
没有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
相当于
>>> sum(chain.from_iterable(lists))
56
另一种方法是使用变量来存储总和而不是列表,并使用 'in' 关键字遍历列表项而不是范围:
def nested_sum(lists):
list_sum = 0
for i in lists:
list_sum += sum(i)
print (list_sum)
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)
你不需要任何中间列表(也不需要额外的内存,根据 Lol4t0 的评论)
def nested_sum(lists):
print sum(sum(l) for l in lists)
我使用的语法是 generator expression.
当然声明你的函数 w/o 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)
有一种更短、更像 Python 的方法:
>>> lists = [[2,4], [1]]
>>> [sum(x) for x in lists]
输出: [6, 1]
您可以进一步阅读列表理解