将数据附加到未声明的列表中

时间:2012-11-12 08:27:58

标签: python python-3.x

在我用Python编写代码时,每隔一段时间就会出现以下情况:

我遍历循环并发现我想将变量的中间值存储在列表中以供稍后使用。以下是一个非常基本的示例代码:

for x in range(0,10):
    y = x*x
    temp_list.append(y)

问题是temp_list尚未宣布。所以我通常会导航到循环的顶部,然后添加以下内容:

temp_list = []
for x in range(0,10):
    y = x*x
    temp_list.append(y)

虽然这可能看起来微不足道,但我只是想知道是否有任何pythonic方法来创建一个列表,如果它不存在然后追加一个值,否则如果它存在,只需追加?

4 个答案:

答案 0 :(得分:8)

对于你的基础样本,可以使用列表理解来完成:

l = [x*x for x in range(0, 10)]

答案 1 :(得分:3)

应该始终清楚是否声明了变量。您希望如何访问它?

你可以动态做的是一个词典:

a = {}

for x in range(0,10):
    y = x*x
    a.setdefault('temp_list', []).append(y)

仅在需要时才会创建a['temp_list']

答案 2 :(得分:2)

根据您的问题,处理这种结构的良好“pythonic”方式可能是将其抽象为生成器。对于你的小例子:

def squares():
    for x in range(0,10):
        y = x*x
        yield y

然后:

temp_list = [i for i in squares()]

当你需要一个像这样的临时列表时,很常见,因为你正在对数据运行一系列操作,每个操作都涉及另一个循环。使用生成器可以显着提高性能和内存使用率,因为它们只会产生一个循环。

请注意,对于简单的示例,通常更容易编写生成器表达式:

temp_list = (x*x for x in range(0, 10))

如果你想要一种不那么pythonic的方式,你可以编辑locals字典,但这不是一个好主意,因为它会导致混淆的代码:

for x in range(0, 10):
    y = x*x
    locals().setdefault('temp_list', []).append(y)

答案 3 :(得分:0)

另一种根据 OPs 模板使用 locals 的方法,

for x in range(0,10):
   y = x * x
   temp_list = temp_list + [y] if "temp_list" in locals() else [y]

print(temp_list)

给予,

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[Program finished]

但是是的,这应该可以通过列表理解来解决