从字符串python中生成所有字谜

时间:2012-08-16 14:34:09

标签: python

我今天正在考虑这个问题,我带来了以下伪代码(Python 3.2):

def anagrams( string ):

    for c in string:
      anagram = c + anagram( string - {c} ) # remove the char from its position in the string
      print(anagram)

    return

def main():

    word = "abcd"
    anagrams( word )

    return

但是,我想知道一种pythonic方法来执行此操作:    anagram = c + anagram(字符串 - {c})

如何从字符串中删除该字符?例如:

"abc" -> 'a' + "bc" -> 'a' + 'b' + "c" -> 'a' + 'b' + 'c' = 'abc'
             + "cb" -> 'a' + 'c' + "b" -> 'a' + 'c' + 'b' = 'acb'
      -> 'b' + "ac" -> 'b' + 'a' + "c" -> 'b' + 'a' + 'c' = 'bac'
             + "ca" -> 'b' + 'c' + "a" -> 'b' + 'c' + 'a' = 'bca'
      -> 'c' + "ba" -> 'c' + 'b' + "a" -> 'c' + 'b' + 'a' = 'cba'
             + "ab" -> 'c' + 'a' + "b" -> 'c' + 'a' + 'b' = 'cab'

由于

4 个答案:

答案 0 :(得分:20)

为什么不使用itertools

>>> import itertools
>>> ["".join(perm) for perm in itertools.permutations("abc")]
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

documentation还包含代码如何完成排列。


修改

Without itertools

def all_perms(elements):
    if len(elements) <=1:
        yield elements
    else:
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                yield perm[:i] + elements[0:1] + perm[i:]


word = "abc"
print list(all_perms(word))

没有itertools且没有generators

def all_perms(elements):
    if len(elements) <=1:
        return elements
    else:
        tmp = []
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                tmp.append(perm[:i] + elements[0:1] + perm[i:])
        return tmp

<强>结果:

  

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

答案 1 :(得分:4)

使用itertools模块。

import itertools
perms = [''.join(perm) for perm in itertools.permutations('abc')]

答案 2 :(得分:1)

请注意,如果字符串包含多个字母实例,@ sloth的答案会产生一些意外的结果 - 重复排列:

["".join(perm) for perm in itertools.permutations('aabc')]

结果:

['aabc',
 'aacb',
 'abac',
 'abca',
 'acab',
 'acba',
 'aabc',
 'aacb',
 'abac',
 'abca',
 'acab',
 'acba',
 'baac',
 'baca',
 'baac',
 'baca',
 'bcaa',
 'bcaa',
 'caab',
 'caba',
 'caab',
 'caba',
 'cbaa',
 'cbaa']

如果这不是所需的结果,请使用&#39;设置&#39;将消除重复。虽然如果您想要一个列表,但您需要重新申请(同时“设置&#39;不维护订单,因此请使用&#39;排序&#39;”)

sorted(set(["".join(perm) for perm in itertools.permutations("aabc")]))

结果:

['aabc',
 'aacb',
 'abac',
 'abca',
 'acab',
 'acba',
 'baac',
 'baca',
 'bcaa',
 'caab',
 'caba',
 'cbaa']

答案 3 :(得分:0)

您可以将单词转换为列表,运行remove,然后使用join将其重新组合在一起。

word = 'abca'
letters = list(word)
letters.remove('a')  # Only deletes the first 'a'
word = ''.join(letters)