当前位置: 首页 > 知识库问答 >
问题:

如何在python中打印所有可能的不同长度的排列?

邵正雅
2023-03-14

我正在尝试打印不同长度字符串的所有可能排列

我正在做

def toString(List):
    return ''.join(List)


def permute(string1, l, r):
    if l == r:
        print(toString(string1))
    else:
        for i in range(l, r + 1):
            string1[l], string1[i] = string1[i], string1[l]
            permute(string1, l + 1, r)
            string1[l], string1[i] = string1[i], string1[l] 


string = "ABC"
n = len(string)
a = list(string)
permute(a, 0, n-1)

但它返回ABC ACB BAC BCA CBA CAB

我希望它返回A,B,C,AB,BC,AC,ABC,ACB,BAC等。

我无法做到这一点

共有2个答案

何灿
2023-03-14

很接近了,只需再包装一个for循环,然后使用函数计算所有子串的置换:

def toString(List):
    return ''.join(List)


def permute(string1, l, r):
    if l == r and r != 0:
        print(toString(string1))
    else:
        for i in range(l, r + 1):
            string1[l], string1[i] = string1[i], string1[l]
            permute(string1, l + 1, r)
            string1[l], string1[i] = string1[i], string1[l]


my_string = "ABC"
for s in my_string:
    print(s)
for i,_ in enumerate(my_string):
    n = len(my_string[:i+1])
    a = list(my_string[:i+1])
    permute(a, 0, n-1)


王云
2023-03-14

我猜您正在寻找字符串的所有可能子集,而不是排列,如果是这样,那么您可以使用以下任何一种方法,这些方法对您来说都很直观

def permute(string1):
    n = len(string1)
    finalSet = ['']

    def permutation(size, cur, k):
        if len(cur) == size:
            finalSet.append(''.join(cur))
            return

        for j in range(k, n):
            permutation(size, cur + [string1[j]], j+1)

    for i in range(1, n):
        permutation(i, [], 0)

    finalSet.append(string1)

    return finalSet


print(permute("ABC"))
# Output : ['', 'A', 'B', 'C', 'AB', 'AC', 'BC', 'ABC']

另一种使用二进制数据创建子集的方法

# Short and simple approach
def permute(string1):
    superSet = []
    n = len(string1)

    for i in range(2**n, 2**(n+1)):
        seq = [x for x in bin(i)[3:]]
        superSet.append(''.join([string1[j]
                                 for j in range(n) if seq[j] == '1']))

    return superSet


print(permute("ABC"))
# Output : ['', 'C', 'B', 'BC', 'A', 'AC', 'AB', 'ABC']
 类似资料:
  • 问题内容: 我正在尝试生成所有可能的长度N总计为S的列表。我已经编写了一些代码来这样做,但是在任何大的东西上(特别是我希望N = 5,S = 100),我都遇到了内存溢出错误。 我正在寻找一个更好的解决方案,或者一种方法来改进我的代码,以便可以在N = 5,S = 100上运行它。下面的这两个程序协同工作,以在嵌套列表中创建所有可能的数字组合,然后将它们重新加工为正确的格式。以下是一些示例输出。

  • 问题内容: 我正在为我的GCSE学习,其中一部分要求我打印按字母顺序排序的字典,并且打印内容应包含相关值。 我花了数小时试图找到答案,并浏览了该论坛上的各种帖子,但对于我的有限知识而言,大多数帖子太过复杂。 我可以打印按字母顺序排序的键,也可以打印排序后的值,但不能打印按字母顺序排序的键(附带值)。 这是我的简单测试代码 我需要打印带有值的排序键-怎么做? 问题答案:

  • 问题内容: 我需要计算出 仅 在python中所有可能的 大小写 排列的列表,例如,使用ar输入它将返回[‘ar’,’Ar’,’aR’,’AR’] 或arc [‘arc’,’ Arc”,“ ARc”,“ aRc”,“ aRC”,“ ARC”],我知道可能有一些不错的方法,但对于我的一生,我无法弄清楚。 问题答案:

  • 问题内容: 在Python中,我有一个n个列表的列表,每个列表具有可变数量的元素。如何创建包含所有可能排列的单个列表: 例如 我想要 注意,我事先不知道n。我以为itertools.product是正确的方法,但它需要我提前知道参数的数量 问题答案: 您不需要事先知道使用

  • 我想我需要删除字符0-31和127。 是否有一个函数或一段代码来高效地做到这一点?

  • 问题内容: 我想我需要删除0-31和127字符, 是否有功能或一段代码可以有效地做到这一点。 问题答案: 7位ASCII? 如果您的Tardis刚好在1963年登陆,并且您只想要7位可打印的ASCII字符,则可以使用以下方法从0-31和127-255中删除所有内容: 它匹配0-31、127-255范围内的任何内容并将其删除。 8位扩展ASCII? 您掉进了热水浴缸计时机,而您又回到了八十年代。如果