在 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]

您可以进一步阅读列表理解