有序列约束排列Python

时间:2014-11-11 21:14:09

标签: python algorithm permutation multiple-columns

我有一个关于在python中使用排序约束进行排列的问题。对于这个问题,问题的说明可能是最好的

Column 1 | Column 2 | Column 3
1 | a | !
2 | b | @
3 | c | #

现在我想生成所有可能的排列,保持列排序,使列1在第3列之前的第2列之前,用于N列

1-a-!
1-a-@
1-a-#
1-b-!
1-b-@
1-b-#

...等

你可以通过编写嵌套循环来清楚地做到这一点,但我很好奇是否有一种pythonic方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

您正在寻找笛卡尔积,而不是排列。为此,我们有itertools.product

import itertools

columns = [
    ['1', '2', '3'],
    ['a', 'b', 'c'],
    ['!', '@', '#']
    ]

result = ['-'.join(thing) for thing in itertools.product(*columns)]

所以,我们有result

['1-a-!', '1-a-@', '1-a-#', '1-b-!', '1-b-@', '1-b-#', '1-c-!', '1-c-@', '1-c-#', 
 '2-a-!', '2-a-@', '2-a-#', '2-b-!', '2-b-@', '2-b-#', '2-c-!', '2-c-@', '2-c-#', 
 '3-a-!', '3-a-@', '3-a-#', '3-b-!', '3-b-@', '3-b-#', '3-c-!', '3-c-@', '3-c-#']

正如您所看到的,itertools.product还会保留每个参数中的排序,以便!@之前#之前等等,以防您需要它。

顺便说一下,*中的itertools.product(*columns)argument unpacking operator