【发布时间】:2013-01-03 04:57:27
【问题描述】:
我正在研究Project Euler #35,我需要找到一个数字的循环排列。使用itertools,我可以很容易地得到一个数字的排列。但是,我想用列表推导来做(因为它看起来更像 Pythonic;我也在尝试熟悉列表推导)。
我发现所有的圆素数只能包含数字 1、3、7 和 9(这不包括 2 和 5,它们根据定义是圆素数)。如果数字(0、2、4、5、6 或 8)中有任何其他数字,则其中一个排列将不是素数(因为该数字将在至少一个排列中的最后一个)。
因此,我尝试这样做:
from itertools import permutations
l = [x for x in list(permutations('1397', y)) for y in range(7)]
我需要使用y for y in range(7) 以便获得不同长度的排列。
但是,这给了我一个TypeError:
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
l = [x for x in list(permutations('1397', y)) for y in range(7)]
TypeError: an integer is required
这可行,但它没有在一个列表理解中使用两个变量:
l = []
for y in range(7):
l.append([x for x in list(permutations('1379', y))])
如何进行双变量列表理解?谢谢!
【问题讨论】:
-
提示:嵌套列表推导与嵌套循环具有相同的
for顺序。for y in range(7): for x in permutations('1397', y): newlist.append(x)变为newlist = [x for y in range(7) for x in permutations('1397', y)]。 -
list(permutations('1379', y))已经是一个列表,for-loop:[x for x in list(permutations('1379', y))]没用。 -
您根本不应该使用 itertools.permitations。问题是找到循环排列,这是一种特殊的排列。在没有 itertools.permutation 的情况下直接生成它们要容易得多(否则您将需要过滤结果)。同样使用特殊的 Python 标准库函数也不适合像您要解决的练习这样的练习
标签: python list list-comprehension