假设我想创建一个使用Python的ints
列表,其中包含数字1到10的多维数据集 ,如果多维数据集可以被四个整除。
我写了这个工作线:
cube4 = [x ** 3 for x in range(1, 11) if (x ** 3) % 4 == 0]
我对这行代码的看法是,它计算x的立方体两次。是否有更多pythonic 方式来编写此行?或者它是否能够在列表理解中获得好处?
编辑 - 我的问题旨在集中在如何使用Python的功能和细微差别避免无关的计算,同时仍然保持代码简洁和可读。虽然可能已经找到了解决其他问题的解决方案,但我想确保我知道这个问题的最佳答案,而不仅仅是一个有效的解决方案。
答案 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)