在Python中声明列表时出错

时间:2016-02-29 11:33:10

标签: python nested-lists nameerror

这是一小段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,我该如何避免此错误?

7 个答案:

答案 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]

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