4

当我在 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

4 回答 4

8

对于您的基本示例,可以使用列表理解来完成:

l = [x*x for x in range(0, 10)]
于 2012-11-12T08:29:48.633 回答
4

变量是否被声明应该总是很清楚。您希望如何访问它?

您可以动态执行的是 dict 条目:

a = {}

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

只有在a['temp_list']需要时才会创建。

于 2012-11-12T08:32:14.553 回答
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))

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

for x in range(0, 10):
    y = x*x
    locals().setdefault('temp_list', []).append(y)
于 2012-11-12T09:03:27.627 回答
0

根据 OPs 模板使用本地人解决的另一种方法,

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]

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

于 2021-05-19T14:33:39.030 回答