递归Python函数生成字母异位词列表

1 投票
4 回答
3182 浏览
提问于 2025-04-17 20:31

经过很多思考和查资料,我还是搞不明白这个问题。我刚开始学Python,语法对我来说有点难。虽然我对自己想做的事情和递归的概念有个大致的了解,但把它写成Python代码却让我很头疼。

简单来说,我想把一个单词的所有排列组合添加到一个列表里(不允许有重复的字符),然后可以被其他程序或函数调用。

我对返回命令和如何处理空格感到很困惑。我希望递归函数在展开的时候能“返回”一些东西,但我又不想让它在所有字符都遍历完、所有排列组合都生成之前就停止。当我运行下面的代码时,似乎什么都没有发生。

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'))

如果我运行下面的代码,它会在我的显示面板上正常打印出来,但我不知道怎么把它转换成其他程序可以使用的输出格式,比如一个列表。

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

permutations('word')

请问有人能帮我一下吗,趁我还有点头发!非常感谢。

谢谢

Jon

4 个回答

0

我会这样做:

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

然后使用它:

word = 'word'
permutation_generator = permute_nondupe_letters_to_words(word)

bucket_1, bucket_2 = [], []
for i in permutation_generator:
    bucket_1.append(i)
    if i == 'owdr':
        break

for i in permutation_generator:
    bucket_2.append(i)

还有

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

输出结果是:

(10, 14)
1

像这样吗?

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

输出结果:

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

编辑:

我刚意识到你说不允许有重复的字符。对于'word'来说这没什么关系,但假设你有'wordwwwdd'。那么你可以这样做:

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

不过这样会打乱顺序,因为使用了集合,所以结果会变成这样:

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

基本上,你的错误在于

res = res.extend(B)

.extend() 这个方法并不会返回一个新的列表,而是直接修改了原来的列表。

另一个问题是,你没有使用递归调用的返回值。

这里有一种方法可以修复你的代码:

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

        return res

print permutations('word')

撰写回答