递归Python函数生成一个anagram列表

2024-05-21 17:08:36 发布

您现在位置:Python中文网/ 问答频道 /正文

经过一番挠头和谷歌搜索,我还是搞不懂这个。我对Python还很陌生,我正在为语法而挣扎。从概念上讲,我认为我对我想做什么以及如何递归地这样做有一个相当好的想法。然而,从技术上讲,将其编码到Python中被证明是一场噩梦。在

基本上,我想把一个单词的所有排列添加到列表中(不允许重复字符),然后可以由另一个程序或函数调用。在

return命令和如何处理空白让我很困惑。我希望递归函数在展开后“返回”某些内容,但我不希望它停止函数,直到所有的字符都被迭代,所有的排列都在迭代中递归生成。当我运行下面的代码时,似乎什么都没有发生。在

def permutations(A, B = ''):
    assert len(A) >= 0
    assert len(A) == len(set(A))
    res = []
    if len(A) == 0: res = res.extend(B)
    else:
        for i in range(len(A)):
            permutations(A[0:i] + A[i+1:], B + A[i])
    return res

permutations('word'))

如果我运行下面的代码,它会在我的显示面板上打印出来,但是我不知道如何将它转换成可以被其他程序(如列表)使用的输出格式。在

^{pr2}$

当我还留着头发的时候,能不能有人给我个建议!非常感谢。在

谢谢你

乔恩


Tags: 代码程序证明概念编码列表lenreturn
3条回答

像这样?在

from itertools import permutations
a = [x for x in permutations('word')]
print a

输出:

^{2}$

编辑: 我刚意识到你说过不允许重复字符。对于“word”并不重要,但假设您有“wordwwdd”。然后你可以:

[x for x in permutations(''.join(set('wordwwwdd')))] 

但是由于使用了set,它将扰乱顺序,因此它看起来像:

>> [('r', 'o', 'w', 'd'), ('r', 'o', 'd', 'w'), ('r', 'w', 'o', 'd')....

基本上你的错误在

res = res.extend(B)

.extend()不返回新列表,而是修改实例。在

另一个问题是不使用递归调用的返回值。 以下是修复代码的一种方法:

^{2}$

我会这样做:

def permute_nondupe_letters_to_words(iterable):
    return (''.join(i) for i in itertools.permutations(set(iterable)))

使用它:

^{2}$

以及

print(len(bucket_1), len(bucket_2))

印刷品:

(10, 14)

相关问题 更多 >