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

时间:2015-05-28 20:30:16

标签: python syntax list-comprehension

假设我想创建一个使用Python的ints列表,其中包含数字1到10的多维数据集 ,如果多维数据集可以被四个整除。

我写了这个工作线:

cube4 = [x ** 3 for x in range(1, 11) if (x ** 3) % 4 == 0]

我对这行代码的看法是,它计算x的立方体两次。是否有更多pythonic 方式来编写此行?或者它是否能够在列表理解中获得好处?

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

3 个答案:

答案 0 :(得分:16)

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

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

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

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

但是将生成器表达式保留在单独的行上可能有助于理解(没有双关语意)。

演示:

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

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

答案 1 :(得分:3)

当且仅当数字是偶数时,数字的立方体才能被4整除。如果将每个数字扩展为其主要因子,则很容易看到。因此:

cube4 = [x ** 3 for x in range(1, 11) if x % 2 == 0]

答案 2 :(得分:1)

我喜欢单行,但值得注意的是,还有另一种Pythonic方法可以产生所需的list

cube4 = []
for x in range(1, 11):
    y = x ** 3
    if not y%4:
        cube4.append(y)