置换方法任意产生结果

时间:2018-03-14 08:02:03

标签: python permutation itertools

我正在使用cur.execute(sql, (age, gender, name, email, accuracy)) mysql.connection.commit() 模块中的permutations()函数。我必须比较两个字符串。只要一个是另一个的排列,就可以认为这些字符串是相等的。

itertools的文档说:

  

itertools.permutations()

     

返回迭代中元素的连续itertools.permutations(iterable[, r])长度排列。

     

如果未指定r或r,则None默认为可迭代的长度,并生成所有可能的全长排列。

这是我的代码:

r

但是生成import itertools mystr = [] for i in range(0, 2): mystr.append(input()) plist = itertools.permutations(mystr[0]) for i in plist: print(i) if any(x == mystr[1] for x in plist): print("Yes") else: print("No") 需要太长时间。当我尝试打印plist的元素时,该过程最终会被杀死,因为它会产生太多的排列。但它应该只是字符串本身长度的排列。

我的输入是:

plist

我希望输出为Dcoderplatform patlodercDmfro 。但我得到相反的输出(Yes)。

如何改进算法?

2 个答案:

答案 0 :(得分:2)

即使您只生成与输入字符串长度相同的排列,排列的数量也会非常大。考虑示例中的字符串:Dcoderplatform。排列的数量是字符串长度的阶乘。在这种情况下,14!87178291200排列。因此,当给定任意长度的输入字符串时,您可以期望终止进程。

幸运的是,有一种更简单的方法可以做到这一点。假设您不需要使用permutations()函数,则应使用以下方法。

给定两个字符串str1str2,你可以检查一个字符串是否是另一个字符串的排列(anagram):

str1 = 'Dcoderplatform'
str2 = 'patlodercDmfro'
if ''.join(sorted(str1)) == ''.join(sorted(str2)):
    print('{} and {} are anagrams'.format(str1, str2))

答案 1 :(得分:-1)

我认为你应该这样比较:

if(any("".join(x)==mystr[1] for x in plist)):