这个列表理解是否足够pythonic?

Tay*_*pez 6 python syntax list-comprehension

比方说,我想创建的列表ints,它由数字1至10立方体使用Python 只有立方体是由四个整除.

我写了这个工作线:

cube4 = [x ** 3 for x in range(1, 11) if (x ** 3) % 4 == 0]
Run Code Online (Sandbox Code Playgroud)

我对这行代码的看法是,它计算x的立方体两次.是否有更多pythonic方式来写这条线?或者这是否与列表理解一样好?


编辑 -我的问题旨在集中在如何使用Python的功能和细微差别避免无关的计算,同时仍然保持代码简洁和可读.虽然可能已经找到了解决其他问题的解决方案,但我想确保我知道这个问题的最佳答案,而不仅仅是一个有效的解决方案.

Mar*_*ers 16

您可以使用生成器表达式:

cubed = (x ** 3 for x in range(1, 11))
cube4 = [c for c in cubed if c % 4 == 0]
Run Code Online (Sandbox Code Playgroud)

这仍然range()只迭代一次,但现在x ** 3表达式只计算一次,因为生成器表达式被迭代.您可以将它组合成一行:

cube4 = [c for c in (x ** 3 for x in range(1, 11)) if c % 4 == 0]
Run Code Online (Sandbox Code Playgroud)

但将发电机表达保持在一个单独的线上可能有助于理解(没有双关语意).

演示:

>>> [c for c in (x ** 3 for x in range(1, 11)) if c % 4 == 0]
[8, 64, 216, 512, 1000]
Run Code Online (Sandbox Code Playgroud)

当然,从数学上讲,对于你可以使用的简单例子[x ** 3 for x in range(2, 11, 2)],但我怀疑这不是你问题的目的.:-)