无法用Python弄清楚这个简单的递归

时间:2016-04-11 14:45:20

标签: python recursion

也许这不是那么简单,但我试图找到一系列字母的所有排列。

[[a,b],[c,d],[e,f]]为简单起见,因为它可能比3个2个列表(即6个3个字母的列表等)更长。

我希望我的程序在保持主列表顺序的同时找到上述示例的所有8种组合(是排列吗?)。

ace
acf
ade
adf
bce
bcf
bde
bdf

目前我认为下面的解决方案会递归迭代我想要的组合;但是,我无法弄清楚如何按顺序存储它们,因为当它达到第一行的基本条件时,它将简单地转到列表的最后一个索引中的下一个字母。

我不相信我能在itertools

找到适合我的东西
def find_comb(mylist):

    for curr_index in range(0,len(mylist)):

        for letter in mylist[curr_index]:           

            if (curr_index+1<=len(mylist)):
               next_letter=find_comb(mylist[curr_index+1:])

    return 1     #wrote 1 for now because I am stumped

1 个答案:

答案 0 :(得分:1)

我认为你想要的是itertools.product

from itertools import product

x = [['a','b'], ['c','d'], ['e','f']]

for _ in product(*x):
    print _

打印

('a', 'c', 'e')
('a', 'c', 'f')
('a', 'd', 'e')
('a', 'd', 'f')
('b', 'c', 'e')
('b', 'c', 'f')
('b', 'd', 'e')
('b', 'd', 'f')

关于你的评论:

product需要一堆可迭代并生成他们的产品,但是,在您的情况下,您发送的是一个可迭代的(由更多的迭代组成)。因此,您传递l1, l2, l3而不是传递[l1, l2, l3]

要实际传递三个迭代,我们必须使用星号解压缩列表,这会将该单个列表转换为三个参数。有关详情,请参阅What does ** (double star) and * (star) do for parameters?