我正在尝试找出在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解决方案持开放态度。
发布于 2019-12-28 04:10:34
您所要求的是多个列表的有序笛卡尔乘积。它是这样做的:
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)]
https://stackoverflow.com/questions/42683521
复制相似问题