Понимание переменных нескольких переменных

Я работаю над 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))])

Как я могу выполнить понимание списка с двумя переменными? Спасибо!

Ответ 1

Часть 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')]]

Ответ 2

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