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