2015-04-29 5 views
3

У меня есть n списков разной длины, которые я хочу создать все возможные перестановки.Python сгенерирует все n-перестановки n списков

так, например, если a=[1,2] и b=[3,4,5], то я хотел бы получить res=[[1,3],[1,4],[1,5],[2,3],[2,4],[2,5]] Я пытался достичь этого, используя рекурсивную функцию, которая оказалась не очень эффективной и не очень пифонической. Как опытный программист на Python справится с проблемой?

+0

Для каждого i из: для каждого j из b: добавить [a, b] в res. – kiwixz

+0

Вам нужно только решение, поддерживающее 2 списка, или оно должно принимать любое их количество? – shader

+0

произвольное множество списков. С известным количеством списков это было бы легко. – Michael

ответ

14

Это называется Cartesian product двух последовательностей.

Это уже доступно в Python как библиотечная функция: itertools.product.

Пример:

>>> import itertools 
>>> a = [1, 2] 
>>> b = [3, 4, 5] 
>>> list(itertools.product(a, b)) 
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)] 
+0

Спасибо. Я знал, что ответ должен быть простым. Я действительно застрял в неправильном мышлении и пропустил, что это простой декартовой продукт. – Michael

0

вы можете сделать это с помощью функции продукта в itertools,

import itertools 
a = [1,2] 
b = [3, 4, 5] 
out = list(itertools.product(a,b)) 
print out 
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)] 
0

itertools, безусловно, путь, но если вы не хотите идти легкий маршрут. ....

def print_permutations(lists, perms=[]): 
    if not lists: 
     print perms 
    else: 
     current_layer = lists[0] 
     remaining_layers = lists[1:] 
     for word in current_layer: 
      print_permutations(remaining_layers, perms + [word]) 



l = (('quick', 'lazy'), ('brown', 'black', 'grey'), ('fox', 'dog')) 
print_permutations(l) 
Смежные вопросы