10

私はProject Euler #35に取り組んでおり、数値の円順列を見つける必要があります。を使用するitertoolsと、数値の順列を簡単に取得できます。ただし、リスト内包表記を使用して実行したいと考えています (より Pythonic に見えるため、リスト内包表記にも慣れようとしています)。

すべての円素数には、1、3、7、および 9 の数字のみを含めることができることがわかりました (これには、定義上円素数である 2 と 5 は含まれません)。他の数字 (0、2、4、5、6、または 8) が数値に含まれている場合、順列の 1 つが素数ではない (その数字が少なくとも 1 つの順列の最後になるため)。

したがって、私はこれをやってみました:

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

これは機能しますが、1 つのリスト内包表記で 2 つの変数を使用していません。

l = []
for y in range(7):
    l.append([x for x in list(permutations('1379', y))])

二重変数リスト内包表記を行うにはどうすればよいですか? ありがとう!

4

2 に答える 2

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')]]
于 2013-01-19T17:00:01.683 に答える
2
[list(permutations('1397',x)) for x in range(7)]
于 2013-01-19T17:01:35.497 に答える