当前位置: 首页 > 面试题库 >

在python中查找给定字符串的所有可能排列

宰父霖
2023-03-14
问题内容

我有绳子。我想通过更改字符串中的字符顺序来从该字符串生成所有排列。例如,说:

x='stack'

我想要的是这样的清单,

l=['stack','satck','sackt'.......]

目前,我正在迭代字符串的列表强制转换,随机选择2个字母并将它们换位以形成新的字符串,然后将其添加到设置的l强制转换中。根据字符串的长度,我正在计算可能的排列数量,并继续迭代直到集合大小达到极限。必须有更好的方法来做到这一点。


问题答案:

itertools模块具有一个有用的方法,称为permutations()。该文件说:

itertools.permutations(iterable [,r])

返回迭代器中元素的连续r长度排列。

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

排列以字典顺序排序。因此,如果对输入的iterable进行排序,则将按排序顺序生成置换元组。

不过,您必须将排列的字母作为字符串连接起来。

>>> from itertools import permutations
>>> perms = [''.join(p) for p in permutations('stack')]
>>> perms

[“堆栈”,“ stakc”,“ stcak”,“ stcka”,“ stkac”,“ stkca”,“ satck”,“ satkc”,“
sactk”,“ sackt”,“ saktc”,“ sakct”,“
sctak’,’sctka’,’scatk’,’scakt’,’sckta’,’sckat’,’sktac’,’sktca’,’skatc’,’skact’,’skcta’,’skcat’,’tsack’
,“ tsakc”,“ tscak”,“ tscka”,“ tskac”,“ tskca”,“ tasck”,“ taskc”,“ tacsk”,“
tacks”,“ taksc”,“ takcs”,“ tcsak”,“
tcska,’tcask’,tcaks,’tcksa’,’tckas’,tksac’,’tksca’,’tkasc’,’tkacs’,’tkcsa’,’tkcas’,’astck’,’astkc”,“
asctk”,“ asckt”,“ asktc”,“ askct”,“ atsck”,“ atskc”,“ atcsk”,“ atcks”,“
atksc”,“ atkcs”,“ acstk”,“ acskt” ,“ actsk”,“ actks”,“ ackst”,“ ackts”,“
akstc”,“ aksct”,“ aktsc”,“ aktcs”,“ akcst”,“ akcts”,“ cstak”,“ cstka”,“
csatk”,“ csakt”,“ cskta”,“ cskat”,“ ctsak”,“ ctska”,“ ctask”,“ ctaks”,“
ctksa”,“ ctkas”,“ castk”,“ caskt”,“ catsk” ,“ catks”,“ cakst”,“ cakts”,“
cksta”,“ cksat”,“ cktsa”,“ cktas”,“ ckast”,“ ckats”,“ kstac”,“ kstca”,“
ksatc”,’ksact’,’kscta’,’kscat’,’ktsac’,’ktsca’,’ktasc’,’ktacs’,’ktcsa’,’ktcas’,’kastc’,’kasct’,’katsc’,’katcs
‘,’kacst’,’kacts’,’kcsta’,’kcsat’,’kctsa’,’kctas’,’kcast’,’kcats’]


如果您发现自己受到重复的困扰,请尝试将数据拟合到没有重复的结构中,例如set

>>> perms = [''.join(p) for p in permutations('stacks')]
>>> len(perms)
720
>>> len(set(perms))
360

感谢@pst指出这不是我们传统上认为的类型转换,而是更多的对set()构造函数的调用。



 类似资料:
  • 问题内容: 在java中查找字符串的所有排列 问题答案: 在这篇文章中,我们将看到如何在 java 中找到 String 的所有排列。 我们将使用一种非常简单的方法来做到这一点。 取出String的第一个字符,递归地插入剩余String的排列的不同位置。 假设您将 String 作为ABC。 所以我们从 ABC 中取出 A 第一个字符 =A 和 RemainingString = BC 因为我们在

  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 问题内容: 我需要计算出 仅 在python中所有可能的 大小写 排列的列表,例如,使用ar输入它将返回[‘ar’,’Ar’,’aR’,’AR’] 或arc [‘arc’,’ Arc”,“ ARc”,“ aRc”,“ aRC”,“ ARC”],我知道可能有一些不错的方法,但对于我的一生,我无法弄清楚。 问题答案:

  • 我遇到了一个问题语句,要在给定的两个子字符串之间找到所有公共子字符串这样一种方式,在每种情况下都必须打印最长的子字符串。问题声明如下: 编写一个程序来查找两个给定字符串之间的公共子字符串。但不包括包含在较长公共子字符串中的子字符串。 null 在这种情况下,您不必使用字符串实用程序方法,如:contains、indexOf、StringTokenizer、split和replace。 我的算法是这

  • 问题内容: 找到字符串的所有排列的一种优雅方法是什么。例如,的排列会是和,但是较长的字符串呢?有任何实现示例吗? 问题答案:

  • 本文向大家介绍使用Python Regex查找给定字符串中的所有“ 10 + 1”模式,包括了使用Python Regex查找给定字符串中的所有“ 10 + 1”模式的使用技巧和注意事项,需要的朋友参考一下 我们需要在给定的字符串中找到正则表达式模式10 + 1。为此,我们可以使用python中可用的re模块。这个包有一个叫做find all的方法,它接受正则表达式和我们要搜索的字符串。它为我们提