首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中查找给定字符串的所有可能排列

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

Stack Overflow用户
提问于 2011-11-29 14:12:34
回答 26查看 201.9K关注 0票数 105

我有一根绳子。我想通过改变字符串中字符的顺序来生成所有的排列。例如,假设:

代码语言:javascript
运行
复制
x='stack'

我想要的是这样一份清单,

代码语言:javascript
运行
复制
l=['stack','satck','sackt'.......]

目前我正在对字符串的列表cast进行迭代,随机挑选两个字母并将它们转置成一个新的字符串,并将其添加到l的set cast中。根据字符串的长度,我正在计算可能的排列数量,并继续迭代,直到集合大小达到限制。肯定有更好的方法来做到这一点。

EN

回答 26

Stack Overflow用户

回答已采纳

发布于 2011-11-29 14:16:28

itertools模块有一个很有用的方法,叫做permutations()。The documentation说:

itertools.permutations(iterable,r)

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

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

排列是按字典排序顺序发出的。因此,如果输入的迭代值是排序的,则排列元组将按排序的顺序生成。

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

代码语言:javascript
运行
复制
>>> from itertools import permutations
>>> perms = [''.join(p) for p in permutations('stack')]
>>> perms

'stack','stakc','stcak','stcka','stkac','stkca','satck','satkc','sactk','sackt','saktc','sakct','sctak','sctka','tsack','scakt','sckta','sckat','sktac','sktca','skatc','skact','skcta','skcat',‘tsack’,‘'tsakc','tscak','tscka','tskac','tskca','tasck','taskc','tacsk','tacks',’tacsk‘,’tacks‘,'tcsak','tcska','tcask','tcaks','tcksa','tckas','tksac','tksca','tkasc','tkacs','tkcsa','tkcas','astck','astkc',‘'asctk','asckt','asktc','askct','atsck','atskc','atcsk','atkcs','atksc',’atkcs‘,'acstk','acskt','actsk','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',’cksta‘,'cktas','ckast','ckats','kstac','kstca','ksatc','ksact',‘'kscta','kscat','ktsac','ktsca','ktasc','ktacs','ktcsa','ktcas','kastc','kasct','katsc','katcs','kacst',’kact‘,'kcsta','kctsa','kctas','kcast','kcsat’

如果您发现自己被重复项所困扰,请尝试将您的数据放入没有重复项的结构中,如set

代码语言:javascript
运行
复制
>>> perms = [''.join(p) for p in permutations('stacks')]
>>> len(perms)
720
>>> len(set(perms))
360

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

票数 168
EN

Stack Overflow用户

发布于 2014-01-07 01:08:05

你可以得到所有的N!没有太多代码的排列

代码语言:javascript
运行
复制
def permutations(string, step = 0):

    # if we've gotten to the end, print the permutation
    if step == len(string):
        print "".join(string)

    # everything to the right of step has not been swapped yet
    for i in range(step, len(string)):

        # copy the string (store as array)
        string_copy = [character for character in string]

        # swap the current index with the step
        string_copy[step], string_copy[i] = string_copy[i], string_copy[step]

        # recurse on the portion of the string that has not been swapped yet (now it's index will begin with step + 1)
        permutations(string_copy, step + 1)
票数 55
EN

Stack Overflow用户

发布于 2018-12-25 05:53:17

这是基于bactracking用最少的代码进行字符串置换的另一种方法。我们基本上创建了一个循环,然后我们一次交换两个字符,在循环中我们会有递归。请注意,只有当索引器达到字符串的长度时才会打印。示例: ABC i作为起点,递归参数j作为循环

这是一个视觉帮助,它是如何从左到右,从上到下工作的(这是排列顺序)

代码:

代码语言:javascript
运行
复制
def permute(data, i, length): 
    if i==length: 
        print(''.join(data) )
    else: 
        for j in range(i,length): 
            #swap
            data[i], data[j] = data[j], data[i] 
            permute(data, i+1, length) 
            data[i], data[j] = data[j], data[i]  
  

string = "ABC"
n = len(string) 
data = list(string) 
permute(data, 0, n)
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8306654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档