我来自C ++,这是我的第一本编程语言,我只是进入python,并且正在寻找一种从列表切换数字的方法,在C ++中,这将通过使用指针将它们与循环一起移动来完成,但是这次我需要生成所有Python中列表A到列表B的排列
列表A(入门列表)和列表B(结果列表)
A= 1234
B= 4231
程序必须通过同时移动两个数字直到A列表变成B列表来顺序显示所有可能的组合(以下示例简化为4个数字,可能不会显示所有组合)
[1,2,3,4]
[1,2,4,3]
[1,4,2,3]
[4,1,2,3]
[4,2,1,3]
[4,2,3,1]
为了完成这一点,我发现了itertools模块,其中包含许多功能,但是到目前为止还不能实现许多功能,下面的代码种类可以满足其需要,但是不会移动数字成对或不成对
import itertools
from itertools import product, permutations
A = ([1,2,3,4])
B = ([4,2,3,1])
print "\n"
print (list(permutations(sorted(B),4)))
我正在考虑添加一阵子(A!= B)然后停止排列,我已经尝试过了,但是我不熟悉pythons语法,有关如何完成此操作的任何帮助将不胜感激
最佳答案
假设您正在询问解决此排列问题的最佳方法-这是一个不同的答案:
将所有排列视为一个集合。 itertools.permutations
以某种顺序生成所有这些排列。如果要查找所有或某些排列,这就是您想要的。但这不是您想要的。您正在尝试通过这些排列查找路径。 itertools.permutations
生成所有排列的顺序,但不一定是您想要的顺序。当然不是所有的订单:它只会生成一次。
因此,您可以生成所有排列并将其视为网络的节点。然后,只要通过一次交换将节点连接起来,就可以链接它们,以获取图形。这称为排列六面体。然后,您可以在该图上进行搜索,以找到您感兴趣的从a
到b
的所有无环路径。这当然是可能的,但这并不是最佳选择。预先构建整个图形是不必要的步骤,因为可以轻松地按需生成它。
这是一些Python代码,就是这样做的:它在需要时通过为节点生成邻居来对变面体生成深度优先搜索。但是它不使用itertools
。
a = (1,2,3,4)
b = (4,2,3,1)
def children(current):
for i in range(len(a)-1):
yield (current[:i] + (current[i+1],current[i]) +
current[i+2:])
def dfs(current,path,path_as_set):
path.append(current)
path_as_set.add(current)
if current == b:
yield path
else:
for next_perm in children(current):
if next_perm in path_as_set:
continue
for path in dfs(next_perm,path,path_as_set):
yield path
path.pop()
path_as_set.remove(current)
for path in dfs(a,[],set()):
print(path)
如果您真的对使用
itertools.permutations
感兴趣,那么您尝试研究的对象实际上是:itertools.permutations(itertools.permutations(a))
这将生成一系列排列的所有可能路径。您可以通过此操作来拒绝所有不以
a
开头并且包含不是单个交换步骤的操作。但这是一个非常糟糕的方法:此列表很长。关于python - 使用itertools的python中的列表(仅移动2个项目,排列),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32793801/