在不使用迭代工具的情况下在Python中生成字符串的所有排列 [英] Generate all permutations of a string in Python without using itertools

查看:25
本文介绍了在不使用迭代工具的情况下在Python中生成字符串的所有排列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要生成字符串中所有可能的字符排列(带有重复)。如果字符串为‘abc’,则输出应为:

AAA AAB AAC ABC ..。 CBC CCA 建行 Ccc

我不能使用IterTools模块,也不想使用递归(因为这只是一个示例。我真正需要的是输出数百万个排列,并且我害怕耗尽内存)

我可以这样做:

s = 'abc'

for c1 in range(0, 3):
    for c2 in range(0, 3):
        for c3 in range(0, 3):
            print(s[c1]+s[c2]+s[c3])

基本上,我的for循环数与字符串的字符数一样多。 现在假设字符串的长度为10,例如!

有没有更好的方法?

推荐答案

解决此问题的一种简单方法是将字符串中的字符视为特殊数字系统中的数字。弦的长度是底数。因此,'abc'的排列(重复)对应于基数3中从03**3-1的数字,其中'a'是数字0'b'1'c'2

def permutations_with_repetition(s):
    base = len(s)
    for n in range(base**base):
        yield "".join(s[n // base**(base-d-1) % base] for d in range(base))

示例运行:

>>> for p in permutations_with_repetition("abc"):
    print(p)


aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc

如果允许使用itertools,您会希望itertools.product带有repeat关键字参数:itertools.product("abc", repeat=3)

这篇关于在不使用迭代工具的情况下在Python中生成字符串的所有排列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆