多个列表的有效组合(Python)

时间:2017-03-08 22:55:47

标签: python-3.x

我正在试图找出最有效的方法来获取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解决方案持开放态度。

1 个答案:

答案 0 :(得分:1)

您要的是多个列表的排序笛卡尔积。这样完成:

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)]

改编自this Cartesian product answerthis unique list answer