清单迭代工具的所有组合

use*_*933 -1 python recursion combinations list python-itertools

我正在尝试创建一个递归函数,以查找python列表的所有组合。

我想在函数中输入['a','b','c'],并在函数运行时希望跟踪显示如下:

   ['a','b','c']  
   ['['a','a'],['b','a'],['c','a']]      
   ['['a','a','b'],['b','a','b'],['c','a','b']]      
   ['['a','a','b','c'],['b','a','b','c'],['c','a','b','c']]
Run Code Online (Sandbox Code Playgroud)

我的递归函数如下所示:

def combo(lst,new_lst = []):
    for item in lst:
        new_lst.append([lst[0],item])
        print([lst[0],item])
    return combo(new_lst,lst[1:])
Run Code Online (Sandbox Code Playgroud)

jep*_*pio 5

正确的答案是您应该使用itertools.combinations。但是,如果由于某种原因您不想这样做,并且想编写一个递归函数,则可以使用以下代码。它是对生成组合的erlang方法的一种改编,因此乍一看似乎有点奇怪:

def combinations(N, iterable):
    if not N:
        return [[]]
    if not iterable:
        return []

    head = [iterable[0]]
    tail = iterable[1:]
    new_comb = [ head + list_ for list_ in combinations(N - 1, tail) ]

    return new_comb + combinations(N, tail)
Run Code Online (Sandbox Code Playgroud)

这是考虑大小组合的一种非常优雅的方式N:您将可迭代()的第一个元素与N-1其他可迭代()的较小的()组合在一起。然后,您N尾部添加相同大小的尾部()组合。这就是您获得所有可能组合的方式。

如果需要所有长度的所有组合,则可以执行以下操作:

for n in range(1, len(iterable) + 1):
    print(combinations(n, iterable))
Run Code Online (Sandbox Code Playgroud)