我有一根绳子。我想通过改变字符串中字符的顺序来生成所有的排列。例如,假设:
x='stack'我想要的是这样一份清单,
l=['stack','satck','sackt'.......]目前我正在对字符串的列表cast进行迭代,随机挑选两个字母并将它们转置成一个新的字符串,并将其添加到l的set cast中。根据字符串的长度,我正在计算可能的排列数量,并继续迭代,直到集合大小达到限制。肯定有更好的方法来做到这一点。
发布于 2011-11-29 14:16:28
itertools模块有一个很有用的方法,叫做permutations()。The documentation说:
itertools.permutations(iterable,r)
返回迭代体中元素的连续r长度排列。
如果r未指定或为None,则r默认为可迭代的长度,并生成所有可能的全长排列。
排列是按字典排序顺序发出的。因此,如果输入的迭代值是排序的,则排列元组将按排序的顺序生成。
不过,您必须将排列后的字母作为字符串连接起来。
>>> 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
>>> perms = [''.join(p) for p in permutations('stacks')]
>>> len(perms)
720
>>> len(set(perms))
360感谢@pst指出,这不是我们传统上认为的类型转换,而更像是对set()构造函数的调用。
发布于 2014-01-07 01:08:05
你可以得到所有的N!没有太多代码的排列
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)发布于 2018-12-25 05:53:17
这是基于bactracking用最少的代码进行字符串置换的另一种方法。我们基本上创建了一个循环,然后我们一次交换两个字符,在循环中我们会有递归。请注意,只有当索引器达到字符串的长度时才会打印。示例: ABC i作为起点,递归参数j作为循环
这是一个视觉帮助,它是如何从左到右,从上到下工作的(这是排列顺序)

代码:
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)https://stackoverflow.com/questions/8306654
复制相似问题