来自各个子列表的单个元素的组合

时间:2019-05-16 17:05:37

标签: python list recursion sublist

如果我有列表my_list = [['a', 'b'], ['c', 'd', 'e'],如何创建所有可能的元组的列表,其中每个元组都包含来自每个子列表的单个元素?例如:

('a', 'e')有效
('a', 'b')无效
('b', 'c')有效
('c', 'd')无效

重要的是,my_list可以包含任意数量的元素(子列表),并且每个子列表可以具有任意长度。我试图让递归生成器起步,但它还不存在。

我想尝试使用递归而不是itertools。

逻辑是一次遍历2个子列表,并将这些结果存储为下一个子列表扩展的输入。

def foil(lis=l):
    if len(lis) == 2:
        for x in l[0]:
            for y in l[1]:
                yield x + y
    else:
        for p in foil(l[:-1]):
            yield p


for i in foil():
    print(i)

但是,这显然仅适用于len(my_list) == 2。例如,它还需要与my_list = [['a'], ['b'], ['c', 'd']]一起使用,它将返回:

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

干杯!

1 个答案:

答案 0 :(得分:3)

使用itertools.product

import itertools

my_list = [['a', 'b'], ['c', 'd', 'e']]
print(list(itertools.product(*my_list)))
# [('a', 'c'), ('a', 'd'), ('a', 'e'), ('b', 'c'), ('b', 'd'), ('b', 'e')]

my_list = [['a'], ['b'], ['c', 'd']]
print(list(itertools.product(*my_list)))
#[('a', 'b', 'c'), ('a', 'b', 'd')]