рекурсия python в списке списков без isinstance (отличается)

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