python中使用堆栈和/或队列的int列表的置换

2024-06-26 00:07:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个方法def permutations(lst),它接受一个整数列表(如[1,2,3]),并使用递归打印它的所有可能的置换,,而不是。在这个方法中,我还必须使用堆栈和/或队列。在

到目前为止,我已经:

class Queue:

    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        self.items.insert(0,item)

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

    def __rep__(self):
        return str(self.items)


def permutation(lst):
    temp = [0] * len(lst)
    q = Queue()
    q.enqueue(lst)
    i = 1
    while i < len(lst):
        if temp[i] < i:
            j = temp[i] if i % 2 else 0
            lst[j], lst[i] = lst[i], lst[j]
            q.enqueue(lst)
            temp[i] += 1
            i = 1
        else:
            temp[i] = 0
            i += 1

    return q.__rep__()


l = [1,2,3]
print(permutation(l))

但我得到的输出是:[[3,2,1],[3,2,1],[3,2,1],[3,2,1],[3,2,1],[3,2,1]]。在

但是,当我打印lst而不是排队时(用print替换排队行),我得到了正确的输出。[[1,2,3], [2,1,3],[3,1,2],[1,3,2],[2,3,1],[3,2,1]]。在

如何修改代码以使用排队?有什么建议,谢谢。在


Tags: 方法selflenreturnifqueuedefitems
1条回答
网友
1楼 · 发布于 2024-06-26 00:07:40

问题

问题出在enqueue中的列表引用中:有六个引用到同一个列表。每次你改变一个元素,你就改变了所有元素。在中间点打印q,您将看到效果:

    else:
        temp[i] = 0
        i += 1
    print ("temp", temp)
    print ("lst", lst)
    print("q", q.__rep__())

输出:

^{pr2}$

相反,当您排队时,请复制列表:

def enqueue(self, item):
    self.items.insert(0, item[:])

这将为您提供所需的输出。在

相关问题 更多 >