多变量列表理解

时间:2013-01-19 16:57:29

标签: python list list-comprehension

我正在研究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))])

如何进行双变量列表推导?谢谢!

2 个答案:

答案 0 :(得分:14)

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')]]

答案 1 :(得分:3)

[list(permutations('1397',x)) for x in range(7)]