首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python置换生成器拼图

Python置换生成器拼图
EN

Stack Overflow用户
提问于 2010-08-05 11:49:33
回答 2查看 1.1K关注 0票数 0

我正在编写一个置换函数,它用Python生成一个列表的所有置换。我的问题是为什么这是可行的:

代码语言:javascript
复制
def permute(inputData, outputSoFar):
    for elem in inputData:
        if elem not in outputSoFar:
            outputSoFar.append(elem)
            if len(outputSoFar) == len(inputData):
                print outputSoFar
            else:
                permute(inputData, outputSoFar) # --- Recursion
            outputSoFar.pop()

permute([1,2,3],[])

但这不是:

代码语言:javascript
复制
def permute(inputData, outputSoFar):
    for elem in inputData:
        if elem not in outputSoFar:
            outputSoFar.append(elem)
            if len(outputSoFar) == len(inputData):
                yield outputSoFar 
            else:
                permute(inputData, outputSoFar) # --- Recursion
            outputSoFar.pop()

for i in permute([1,2,3], []):
    print i

这也不起作用(生成列表的副本):

代码语言:javascript
复制
def permute(inputData, outputSoFar):
    for elem in inputData:
        if elem not in outputSoFar:
            outputSoFar.append(elem)
            if len(outputSoFar) == len(inputData):
                yield outputSoFar[:] # --- Copy of the list
            else:
                permute(inputData, outputSoFar) # --- Recursion
            outputSoFar.pop()

for i in permute([1,2,3], []):
    print i
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-05 12:22:53

您还必须生成递归调用的结果:

代码语言:javascript
复制
def permute(inputData, outputSoFar):
    for a in inputData:
        if a not in outputSoFar:
            if len(outputSoFar) == len(inputData) - 1:
                yield outputSoFar + [a]
            else:
                for b in permute(inputData, outputSoFar + [a]): # --- Recursion
                    yield b

for i in permute([1,2,3], []):
    print i

..。或者(更接近操作码):

代码语言:javascript
复制
def permute(inputData, outputSoFar):
    for elem in inputData:
        if elem not in outputSoFar:
            outputSoFar.append(elem)
            if len(outputSoFar) == len(inputData):
                yield outputSoFar
            else:
                for permutation in permute(inputData, outputSoFar):
                    yield permutation # --- Recursion
            outputSoFar.pop()

for i in permute([1,2,3], []):
    print i
票数 3
EN

Stack Overflow用户

发布于 2010-08-05 12:07:17

当你做流行音乐的时候,你正在破坏性地丢失物品。使用列表的副本,而不是就地改变它。

或者,使用itertools.permutationsitertools.combinations

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3411612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档