使用列表的一个或所有元素的所有可能排列来填充列表

时间:2018-10-25 20:06:01

标签: python combinations permutation itertools

如何使用列表中一个或所有元素的所有可能排列来填充固定长度的列表?

例如,我想填充3个元素的列表,其中包含一个或所有数字[1,2,3]的所有可能排列。用这3个数字创建长度为3的列表的所有方法是:

arranging = [[1,1,1], [1,1,2], [1,2,2], [2,2,2], [1,1,3], [1,2,3], [2,2,3], [1,3,3], [2,3,3], [3,3,3]]

要找到此列表中每一个的可能排列,我将使用:

populating = [set(itertools.permutations(i, 3)) for i in arranging]

等于:

populating == [{(1, 1, 1)}, {(1, 2, 1), (2, 1, 1), (1, 1, 2)}, {(1, 2, 2), (2, 2, 1), (2, 1, 2)}, {(2, 2, 2)}, {(1, 1, 3), (1, 3, 1), (3, 1, 1)}, {(3, 1, 2), (1, 3, 2), (3, 2, 1), (2, 3, 1), (1, 2, 3), (2, 1, 3)}, {(2, 2, 3), (3, 2, 2), (2, 3, 2)}, {(3, 1, 3), (3, 3, 1), (1, 3, 3)}, {(3, 2, 3), (2, 3, 3), (3, 3, 2)}, {(3, 3, 3)}]

您将如何创建列表arranging(对不起,名称很糟糕)?还有其他更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您要组合使用替换物:

iter = itertools.combinations_with_replacement([1,2,3], 3)

如果将其显示为列表,则会得到:

>>> list(iter)
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), 
 (1, 3, 3), (2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]

请注意,这是不是排列,因为它包含(1, 1, 2)但不包含(1, 2, 1)