如何在python中找到给定字符串的所有排列?

如何在python中找到给定字符串的所有排列?,python,string,algorithm,permutation,Python,String,Algorithm,Permutation,我尝试过这种方法,但它出了问题。那么,有没有办法修复这个片段 def swap(seq, i , j): temp = 0 temp = seq[i] seq[i] = seq[j] seq[j] = temp def all_possible_strings(seq): list_of_results = [] for i in range(len(seq)): for j in range(len(seq)):

我尝试过这种方法,但它出了问题。那么,有没有办法修复这个片段

def swap(seq, i , j):
    temp = 0
    temp = seq[i]
    seq[i] = seq[j]
    seq[j] = temp

def all_possible_strings(seq):
    list_of_results = []
    for i in range(len(seq)):
        for j in range(len(seq)):
            copy_of_seq = seq[:]

            swap(copy_of_seq, i ,j)

            list_of_results.append("".join(copy_of_seq))

    return list_of_results
以下是输出: ['abc','bac','cba','bac','abc','acb','cba','acb','abc']

您可以使用:

导入itertools
序号='abc'
结果列表=[''。在itertools.permutations(seq)中为p加入(p)]
打印(结果列表)
输出:

['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

你的算法不可能解释所有的排列

请注意,对
(i,j)
可以是任何索引对。但是,对于代码中的每个排列,都从原始字符串开始并应用一个交换。这不可能得到所有的排列

假设您从
ABCD
开始。如果您想要反向排列
DCBA
,您将无法在一次交换中完成此操作。一次交换最多只能更改2个字符的位置,但所有4个字符都需要位于不同的位置

请注意,大小为
n
的列表的可能
(i,j)
对的数量为
n*n=n^2
,这与预期的排列数量不同
n。几乎在所有情况下,
n!>n^2
,这意味着肯定会缺少排列

此外,您还有像
(1,1)
这样的对,这会导致交换不起任何作用(这很好,除了现在
(2,2)
(3,3)
,等等。给出重复排列)[感谢代码学徒指出这一点]。您还拥有将导致
ACBD
(1,2)
,以及也将导致
ACBD
(2,1)
。这就是为什么在最终排列列表中有重复排列

另外,在Python中,只需执行
a,b=b,a
即可交换两个元素


希普算法 正确的实现方法是使用类似的东西,这是一种适当的、更复杂的元素切换,以获得所有排列

您不必每次都创建列表的新副本,而是在同一个列表上继续进行交换,它将在所有置换中循环,前提是您按照算法指定的正确顺序进行置换


我不想在这里详述算法,因为参考资料在解释它方面做得很好。如果您真的需要一个显式的Python实现示例,那也是。

输出应该是什么?我建议您阅读有关调试代码的提示。这应该是输出:['abc'、'acb'、'bac'、'bca'、'cab'、'cba']我想练习普通的解决方案,只是为了掌握字符串的概念permutation@MohamedAbdElsattar,此线程还包括有关如何实现置换的链接。因此,如果你在数学方面落后,你应该没问题。此外,用
(i,j)
(1,1)
(2,2)
交换将得到相同的字符串。