首页 > 解决方案 > 使用列表的一个或所有元素的所有可能排列填充列表

问题描述

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

例如,我想填充 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(对不起这个可怕的名字)?还有其他更好的解决方案吗?

标签: pythoncombinationspermutationitertools

解决方案


您想要替换组合:

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)


推荐阅读