我正在尝试找出最有效的方法,以获取Python(3)中多个列表(未知的数字)组合的组合列表。例如,如果我有一个冠军列表:
a = [[0, 1, 2], [0], [0, 1]]
我期望以下输出:
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 1), (0, 1, 2)]
目前,我拥有的最好方法是使用itertools.product()
首先生成三个列表的所有可能排列,对排列的内容进行排序,然后取下这些项目的集合,然后最终对该设置进行排序:
tuples = it.product(*a)
tuples_sorted = [tuple(sorted(i)) for i in tuples]
output = sorted(set(tuples_sorted))
这很好,但是我想知道这样做的效率更高还是内置的方式?我可以想象,多个分类步骤对于大量的统一者或非常长的统一者来说确实很麻烦。我也对Numpy解决方案开放。
您要求的是多个列表的笛卡尔产品。这样做了:
import itertools
>>> a2 = [list(element) for element in itertools.product(*a)]
>>> for i in range(0,len(a2)):
... aa = a2[i]
... aa.sort()
... a2[i] = tuple(aa)
...
>>> a3=[ii for n,ii in enumerate(a3) if ii not in a2[:n]]
>>> a3
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 0, 2), (0, 1, 2)]
根据笛卡尔产品的答案和此独特的列表答案。