我正在研究Project Euler #35,我需要找到一个数字的圆形排列。使用itertools
,我可以轻松获得数字的排列。但是,我想通过列表理解来做到这一点(因为它看起来更像Python风格;我也在尝试熟悉列表理解)。
我发现所有的圆形素数只能包含数字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 y in range(7)
部分应位于置换循环之前。:
l = [x for y in range(7) for x in list(permutations('1397', y))]
上面的列表理解等效于:
In [93]: l = []
In [94]: for y in range(7):
...: l.extend(list(permutations('1397', y)))
例如:
In [76]: l = [x for y in range(3) for x in list(permutations('1397', y))]
In [77]: l
Out[77]:
[(),
('1',),
('3',),
('9',),
('7',),
('1', '3'),
('1', '9'),
('1', '7'),
('3', '1'),
('3', '9'),
('3', '7'),
('9', '1'),
('9', '3'),
('9', '7'),
('7', '1'),
('7', '3'),
('7', '9')]
还有您的工作示例的
list-comprehension
版本,l = []
for y in range(7):
l.append(list(permutations('1397', y)))
是:
In [85]: l = [list(permutations('1397', y)) for y in range(3)]
In [86]: l
Out[86]:
[[()],
[('1',), ('3',), ('9',), ('7',)],
[('1', '3'),
('1', '9'),
('1', '7'),
('3', '1'),
('3', '9'),
('3', '7'),
('9', '1'),
('9', '3'),
('9', '7'),
('7', '1'),
('7', '3'),
('7', '9')]]
关于python - 多变量列表理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14416596/