Понимание переменных нескольких переменных
Я работаю над 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)]