【问题标题】:Python 3 exercise: generating permutationPython 3 练习:生成排列
【发布时间】:2012-06-27 07:41:54
【问题描述】:

我正在尝试编写一个用于排列的生成器函数以进行练习。但它不返回任何东西。 但如果我更换 ''yield new[k]'' 和 ''lis.append(new[k])'',然后我得到正确的排列列表。我在收益方面做错了吗?

tup=(1,2,3) # tup can be any sequence
new=[[]]*(len(tup)+1) # memory; new[0]=[], new[1] will be length 1 permutation, etc.
lis=[]  # the list of permutations

def repeat(k): # recursion
    for i in tup:
        if i in new[k-1]:
            continue # permutation can't repeat
        else: new[k]=new[k-1]+[i]

        if k==len(tup): 
             yield new[k]
        else:
             repeat(k+1)

gen=repeat(1)
for i in gen:
    print(i)

【问题讨论】:

  • 标签有什么问题?
  • 他们破坏了格式。它们只能非常小心地使用,而且不值得。永远不要在源文件中有选项卡。如果您需要在某些文本中添加制表符,请将其写成'\t'

标签: python-3.x generator yield


【解决方案1】:

这是一个递归函数,但你不会从递归中传递值,这就是它不返回任何内容的原因。

你需要把调用改成

repeat(k+1)

for x in repeat(k+1):
    yield x

然后得到的函数是:

tup=(1,2,3) # tup can be any sequence
new=[[]]*(len(tup)+1) # memory; new[0]=[], new[1] will be length 1 permutation, etc.
lis=[]  # the list of permutations

def repeat(k): # recursion
    for i in tup:
        if i in new[k-1]:
            continue # permutation can't repeat
        else: new[k]=new[k-1]+[i]

        if k==len(tup): 
             yield new[k]
        else:
             for x in repeat(k+1):
                 yield x

for i in repeat(1):
    print(i)

哪个有效。

下一步就是去掉全局变量。

【讨论】:

  • 谢谢。去掉全局变量,是不是要定义另一个函数,比如 permutation(tup) 并将这些变量包含在这个函数的定义中?
  • @user1470575:嗯,我的意思是将变量包含在现有的repeat() 函数中。但这并不总是正确的解决方案,但另一个包装函数很少是正确的。有时类是一个很好的解决方案。
【解决方案2】:

我认为您正在尝试编写一个算法来使用生成器生成多个长度的排列以进行练习。

试试这个问题的大小: How to generate all permutations of a list in Python

你需要翻译成python3,这应该不是什么大问题。

不幸的是,我认为你的问题在于你的算法,而不是你使用yield,这对我来说看起来不错。

【讨论】:

  • 我正在存储较短长度的排列,因为在生成一个全长排列后,我只想增加最后一个条目以生成新的全长排列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多