【问题标题】:How to check if object exists in queue before pushing new object [duplicate]如何在推送新对象之前检查对象是否存在于队列中[重复]
【发布时间】:2014-11-19 19:03:12
【问题描述】:

我正在使用 Python 队列:

q = Queue.Queue()

我正在使用q.put(item) 将某个类的对象放入上述队列。但是,在将项目放入队列之前,我想检查它是否已经存在于队列中。有没有办法做到这一点? [没有取出队列中的所有对象,然后将它们全部推回]

另外:

我不知道如何才能真正看到我放入队列的变量(调试时)。我正在使用 Pydev,我在 variables 窗口中看到的只有 not_emptynot_full 之类的东西。在运行时如何查看队列中的内容?

【问题讨论】:

    标签: python queue pydev


    【解决方案1】:

    您可以将 'q.queue' 视为一个列表。

    if item in q.queue:
       print("already there!")
    

    【讨论】:

    • 在python2.5上这会导致<type 'exceptions.TypeError'>:argument of type 'instance' is not iterable
    • 这不会在检查和打印/处理数据之间引起竞争条件
    • 抱歉 - 对于 Python 3.6 会发生同样的错误 -> TypeError: 'Queue' 类型的参数不可迭代
    • 请注意qqueue.Queue 对象的一个​​实例,而q.queue 是一个允许迭代的collections.deque 参数。
    【解决方案2】:

    如果你愿意,你可以为你自己的类提供这样的机制。

    class UniqueQueue:
    
        def __init__(self):
            self.__item_pool = []
    
        def push(self, item):
            if item not in self.__item_pool:
                self.__item_pool.append(item)
    
        def pop(self):
            return self.__item_pool.pop()
    

    【讨论】:

      【解决方案3】:

      您确定需要queue.Queue 吗? queue.Queue 是一个同步集合,因此提供了比大多数情况下所需的更多功能。

      您可能想看看使用queue.deque 或可能使用this recipe 创建自己的OrderedSet

      例如。

      q = queue.deque()
      q.appendleft(1)
      q.appendleft(2)
      q.appendleft(3)
      assert 2 in q
      assert q.pop() == 1
      

      在 python 2 中,queue 模块被称为Queue

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 2015-05-26
        • 2018-03-12
        相关资源
        最近更新 更多