列表理解而不保存它与单行循环

时间:2019-07-20 12:32:15

标签: python python-3.x list list-comprehension

在以下三种情况下是符合pythonic和样式指南的操作方式。

sq, div2 = [], []

# 1 Classic for loop
for i in range(10):
    sq.append(i**2)
    div2.append(i/2)

# 2 ListComp
[(sq.append(i**2), div2.append(i/2)) for i in range(10)]

# 3 single line for loop
for i in range(10):(sq.append(i**2), div2.append(i/2))

# this is also there but will have multiple loops
sq, div2 = [[i**2 for i in range(10)], [i/2 for i in range(10)]]

或任何更好的方法,其中一个for循环会生成多个列表并分配var。

1 个答案:

答案 0 :(得分:4)

第一个绝对是您列出的四个中的最佳选择。

不要使用列表推导,除非您实际上希望列表产生,并且不要将for循环塞入一行以使它成为单行。有两个循环似乎是第四个循环的明显缺点。尽管您应该剖析两次迭代是否对运行时间产生重大影响,但您重复自己的次数比必要的多。我怀疑您可能需要生成非常长的列表,然后才能真正区分一个循环和两个循环。


但是,您忽略了一个选择:生成一个元组序列,然后将其“解压缩”为一个 tuples 元组。

sq, div2 = zip(*((i**2, i/2) for i in range(10)))

不过,我认为我仍然希望看到第一个。更清晰了,不需要读者识别解压缩的习惯用法。