求解经典P(n,r)的Python代码:一次打印n个对象的所有排列,不重复

求解经典P(n,r)的Python代码:一次打印n个对象的所有排列,不重复,python,permutation,Python,Permutation,用于解决经典问题的Python代码p(n,r) 问题:一次打印n个对象的所有排列,不重复 我是一名Python学习者,我在寻找优雅的解决方案,而不是在工作中试图解决编码问题。 有兴趣看一下解决经典的置换问题的代码吗?P(n,r)置换问题——如何一次打印一个字符串的所有置换,而不需要重复字符 因为学习是我的重点,对使用Python itertools“排列”库函数不感兴趣。看着它,但不明白它在做什么。寻找解决这个问题的实际代码,这样我就可以学习实现了 示例:如果输入字符串s=='abcdef',r

用于解决经典问题的Python代码
p(n,r)

问题:一次打印n个对象的所有排列,不重复

我是一名Python学习者,我在寻找优雅的解决方案,而不是在工作中试图解决编码问题。 有兴趣看一下解决经典的置换问题的代码吗?P(n,r)置换问题——如何一次打印一个字符串的所有置换,而不需要重复字符

因为学习是我的重点,对使用Python itertools“排列”库函数不感兴趣。看着它,但不明白它在做什么。寻找解决这个问题的实际代码,这样我就可以学习实现了

示例:如果输入字符串s=='abcdef',r==4,则n==6。 输出类似于:abcd abce abcf ABD ABD abdf abef abef


有很多非常相似的问题,但我没有发现重复的问题。大多数指定“r”。我想把r作为一个输入参数,以保持解决方案的通用性。

这种方法使用递归生成器函数,我觉得非常可读。最容易从组合开始:

def combs(s, r):
    if not r:
        yield ''
    elif s:
        first, rest = s[0], s[1:]
        for comb in combs(rest, r-1):
            yield first + comb  # use first char ...
        yield from combs(rest, r)  # ... or don't

>>> list(combs('abcd', 2))
['ab', 'ac', 'ad', 'bc', 'bd', 'cd']
>>> list(combs('abcd', 3))
['abc', 'abd', 'acd', 'bcd']
并在其上建立排列:

def perms(s, r):
    if not r:
        yield ''
    else:
        for comb in combs(s, r):
            for i, char in enumerate(comb):
                rest = comb[:i] + comb[i+1:] 
                for perm in perms(rest, r-1):
                    yield char + perm

>>> list(perms('abc', 2))
['ab', 'ba', 'ac', 'ca', 'bc', 'cb']
>>> list(perms('abcd', 2))
['ab', 'ba', 'ac', 'ca', 'ad', 'da', 'bc', 'cb', 'bd', 'db', 'cd', 'dc']

这种方法使用递归生成器函数,我觉得非常可读。最容易从组合开始:

def combs(s, r):
    if not r:
        yield ''
    elif s:
        first, rest = s[0], s[1:]
        for comb in combs(rest, r-1):
            yield first + comb  # use first char ...
        yield from combs(rest, r)  # ... or don't

>>> list(combs('abcd', 2))
['ab', 'ac', 'ad', 'bc', 'bd', 'cd']
>>> list(combs('abcd', 3))
['abc', 'abd', 'acd', 'bcd']
并在其上建立排列:

def perms(s, r):
    if not r:
        yield ''
    else:
        for comb in combs(s, r):
            for i, char in enumerate(comb):
                rest = comb[:i] + comb[i+1:] 
                for perm in perms(rest, r-1):
                    yield char + perm

>>> list(perms('abc', 2))
['ab', 'ba', 'ac', 'ca', 'bc', 'cb']
>>> list(perms('abcd', 2))
['ab', 'ba', 'ac', 'ca', 'ad', 'da', 'bc', 'cb', 'bd', 'db', 'cd', 'dc']

您的示例看起来更像组合。你也在找abdc吗?你可能是对的,但我不明白这个问题。请详细说明。我可能需要改变这个问题。用于生成置换的算法在itertools的源代码中有大量的注释。置换:意思是如果你的输入像aa,那么输出只能是aa,而不是aa,因为你提到了没有重复。我没想那么远。让我们假设没有重复的字符,以保持简单…您的示例看起来更像组合。你也在找abdc吗?你可能是对的,但我不明白这个问题。请详细说明。我可能需要改变这个问题。用于生成置换的算法在itertools的源代码中有大量的注释。置换:意思是如果你的输入像aa,那么输出只能是aa,而不是aa,因为你提到了没有重复。我没想那么远。让我们假设没有重复的字符,以保持简单。。。