#python #recursion
#python #рекурсия
Вопрос:
У меня есть произвольный список произвольных (но единообразных) списков чисел. (Это граничные координаты ячеек в n-пространстве, углы которых я хочу отобразить, но это не важно.) Я хочу сгенерировать список всех возможных комбинаций. Итак: [[1,2], [3,4],[5,6]] производит [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5]…].
Кто-нибудь может помочь мне улучшить этот код? Мне не нравится вызов isinstance(), но я не могу придумать более понятный для python способ добавления элементов на первом проходе, когда первый аргумент (pos) представляет собой список чисел, а не список списков.
def recurse(pos, vals):
out = []
for p in pos:
pl = p if isinstance(p,list) else [p]
for x in vals[0]:
out.append(pl [x])
if vals[1:]:
return recurse(out, vals[1:])
else:
return out
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
b = recurse(a[0], a[1:])
Спасибо.
Ответ №1:
Из вашего примера кажется, что все, что вы хотите, это
from itertools import product
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
print list(product(*a))
Ответ №2:
Попробуйте с помощью itertools.product
import itertools
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
iterator = itertools.product(*a)
result = [item for item in iterator.next()]
Ответ №3:
Чтобы быть более питонистским, вы не хотите выполнять проверку типов. Python — это набор текста по каналу. Что произойдет, если вы передадите кортеж функции (которая должна быть более эффективной).
Вы могли бы попробовать
if type(p) != list:
try:
p = list(p)
except TypeError:
p = [p]
pl = p
Ответ №4:
Когда есть библиотека / модуль, который делает то, что вы хотите, вы должны выбрать его ( 1 всем тем, кто упомянул itertools.product). Однако, если вас интересует алгоритм для достижения этой цели, вы ищете класс алгоритмов, называемых рекурсивным спуском
answer = []
def recurse(points, curr=[]):
if not points:
answer.append(curr)
curr = []
return
else:
for coord in points[0]:
recurse(points[1:], curr [coord])