例如下面的代码
primeList = []
for val in range(2, num):
if not any(val % i == 0 for i in primeList):
primeList.append(val)
我怎样才能将这段确切的代码转化为列表推导式?
请您参考如下方法:
不,你不能,因为在理解完成迭代之前,列表不作为 Python 对象存在。您不能引用不存在的对象。老实说,我只想将其保留为 for 循环 - 列表推导并不是替换所有列表构造循环的 Elixir 。
但是...您可能会变得棘手并使用仅按需评估的生成器。将其与列表的 extend() 方法相结合,该方法在获取元素时将元素添加到列表中(无论如何在我的测试中),您可以使用要扩展的列表的当前内容当你扩展它时。
# make sure to set `num`
plist = []
plist.extend(c for c in range(2, num) if not any(c % p == 0 for p in plist))
公平警告:据我所知,extend() 在生成元素时将元素添加到列表中的事实不是规范的一部分,因此这段代码是否有效可能是依赖于实现。但我在 Python 2.7 和 3.4 中对其进行了测试,每次都得到一个素数列表。
