【发布时间】:2016-11-30 03:24:05
【问题描述】:
我有兴趣在集合 S={1, 2, ..., n} 中找到排列 p:S->S。特别是所有对 i 和 j 进行置换的函数:p(i)=j 和 p(j)=i;或者让它们保持不变 p(i)=i 或 p(j)=j。
例如,如果 S={1,2,3},我应该得到类似:
p0 = [(1), (2), (3)] # p(1)=1, p(2)=2, p(3)=3
p1 = [(1,2), (3)] # p(1)=2, p(2)=1, p(3)=3
p2 = [(1,3), (2)]
p3 = [(2,3), (1)]
如果 S={1, 2, 3, 4}:
p0 = [(1), (2), (3), (4)]
p1 = [(1,2), (3,4)]
p2 = [(1,2), (3), (4)] # p(1)=2, p(2)=1, p(3)=3, p(4)=4
p3 = [(1,3), (2,4)]
p4 = [(1,3), (2), (4)]
p5 = [(1,4), (2,3)]
p6 = [(1,4), (2), (3)]
p7 = [(1), (3), (2,4)]
p8 = [(1), (4), (2,3)]
p9 = [(1), (2), (3,4)]
谢谢。
【问题讨论】:
-
你试过什么?你清楚地知道
itertools,一旦你知道了它,你就不难将它用于你的构建块。 -
我认为不应该有这么多反对票,这不是关于 任意 排列,而是它们的一个特殊子集。一个有效的实现有点棘手。
-
@Kh40tiK:甚至不尝试就寻求帮助并不符合 SO 的精神。
-
我意识到它需要一个算法。我对使用简单的 itertools 解决它的更紧凑的方法感兴趣。
-
这看起来像你想要的:stackoverflow.com/q/18353280/5644961
标签: python list set combinatorics itertools