从字符串 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( string - {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'

谢谢

原文由 cybertextron 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 289
2 个回答

为什么不直接使用 itertools 呢?

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

文档 还包含如何完成排列的代码。


编辑:

没有 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’]

原文由 sloth 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 itertools 模块。

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

原文由 Lanaru 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏