生成多个列表中每个项目的组合

3 投票
1 回答
1629 浏览
提问于 2025-04-17 15:46

我想处理一个数量不确定的列表,每个列表的长度也不固定,然后从每个列表中选一个元素,生成所有可能的组合。为了提高效率,我只需要遍历每种组合,而不是把结果存下来。

比如,下面这个列表的列表:

[['A','B','C'],['w','x','y','z'],[1,2]]

会变成:

['A','w',1],['A','w',2],['A','x',1],['A','x',2],...,['C','z',1],['C','z',2]

这不是简单的合并,也不是 itertools.permutation() 的功能……如果我提前知道有多少个列表,这个事情就简单多了,但在这种情况下我并不知道。我相信我可以写一个递归的解决方案,但也许这个问题已经有人解决过了。有什么好的建议吗?

1 个回答

10

itertools.product 是你需要的工具

>>> some_list = [['A','B','C'],['w','x','y','z'],[1,2]]
>>> list(itertools.product(*some_list))
[('A', 'w', 1), ('A', 'w', 2), ('A', 'x', 1), ('A', 'x', 2), ('A', 'y', 1), ('A', 'y', 2), ('A', 'z', 1), ('A', 'z', 2), ('B', 'w', 1), ('B', 'w', 2), ('B', 'x', 1), ('B', 'x', 2), ('B', 'y', 1), ('B', 'y', 2), ('B', 'z', 1), ('B', 'z', 2), ('C', 'w', 1), ('C', 'w', 2), ('C', 'x', 1), ('C', 'x', 2), ('C', 'y', 1), ('C', 'y', 2), ('C', 'z', 1), ('C', 'z', 2)]

几个关键点

  1. itertools.product 需要你把可迭代对象作为参数传进去。所以你需要用 splat 操作符来把列表当作参数传递
  2. itertools.product 返回的是一个生成器。你需要把它转换成列表,才能查看所有内容。或者你也可以直接遍历它,或者把它传给一个需要可迭代对象的函数

    for e in itertools.product(*some_list):
        print e
    

撰写回答