我有一个关于在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方法来做到这一点。
答案 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。