当前位置: 首页 > 面试题库 >

检查元素是否已在队列中

宇文俊明
2023-03-14
问题内容

我正在Queuepython中使用该库,并且希望保持队列条目唯一。

因此,我想在添加到队列之前检查队列中是否没有“某物”,本质上是这样的函数,它可以在队列库中工作:

queue = Queue.Queue()
def in_queue(u):
  return u in queue

还是我应该使用其他库/方法来实现这一目标?


问题答案:

标准Queue类不能被迭代或检查。

但是,它被构建为可扩展。

首先,如果你看一下源(这是从文档的链接),有钩的方法_init_qsize_put并且_get可以覆盖改变实现。查看主类下面的子类,您可以看到它们是如何做到的。

因此,一件容易的事是用替换deque实现set

class SetQueue(Queue.Queue):
    def _init(self, maxsize):
        self.queue = set()
    def _put(self, item):
        self.queue.add(item)
    def _get(self):
        return self.queue.pop()

(我没有实现,_qsize因为默认return len(self.queue)值很好。)

现在,您无需检查,只需将其添加到队列中,如果已经存在,它将被忽略。

当然,这样做的缺点是不再对队列进行排序。但是您可以使用OrderedSet(类似于OrderedDictin
collections)解决此问题。文档链接了一个食谱collections。一旦拥有了:

class OrderedSetQueue(Queue.Queue):
    def _init(self, maxsize):
        self.queue = OrderedSet()
    def _put(self, item):
        self.queue.add(item)
    def _get(self):
        return self.queue.pop()

如果您实际上希望能够检查队列中的值,则可以为此添加一个方法:

class CheckableQueue(Queue.Queue): # or OrderedSetQueue
    def __contains__(self, item):
        with self.mutex:
            return item in self.queue

但是,这会在您的代码中引发竞争条件。例如,如果您这样做:

if x not in my_queue:
    my_queue.put(x)

它总是可能的,x是不在队列中,当您检查,但 就是 在排队的时候你打电话put。实际上,只有使用此功能,其中 不会
是不安全的某种乐观检查的(如果该值不在队列中, 现在
,做一些费时的工作,然后尝试添加它,接受这项工作是浪费(如果同时添加了该值),则Queue.full()存在相同的原因。

确保这种安全的唯一方法是将两个操作放在一起:

with my_queue.mutex:
    if x not in my_queue:
        my_queue.put(x)

但是在这一点上,您首先要击败使用的目的Queue。(您还取决于Queue.mutex是可递归输入的互斥量的事实。)最好将操作添加为Queue子类的方法。

而且,如果您 始终 要先检查并仅在不存在时进行添加OrderedSetQueue则是一种更好的方法。



 类似资料:
  • 问题内容: 我想检查Selenium中是否存在一个元素,如果存在,请将其分配给一个名称。 现在,我有这样的东西: 但是,当不存在值为9的元素时,它将返回错误。有没有一种方法可以检查它是否存在,或者类似的东西? 问题答案: 有几种选择。我推荐这些。 1.创建方法或Web驱动程序扩展。 2.计算元素,如果有1个或更多元素,则获取它。 那你可以检查

  • 我需要验证表中是否已经存在列。我的类扩展了CustomTaskChange,因此我的方法接收一个数据库对象作为参数。我可以通过ResultSetObject进行我想要的验证吗?

  • 问题内容: 我有一个问题-我正在使用Selenium(firefox)Web驱动程序打开网页,单击一些链接等,然后捕获屏幕截图。 我的脚本可以从CLI正常运行,但是通过cronjob运行时,它并没有通过第一个find_element()测试。我需要添加一些调试,或一些帮助我弄清为什么失败的东西。 基本上,我必须先单击“登录”锚点,然后才能进入登录页面。元素的构造为: 我正在通过LINK_TEXT方

  • 问题内容: 我正在尝试通过查找元素 在Python中,selenium并不总是存在。是否有一条快速的线检查它是否存在,并在不存在时显示NULL或FALSE代替错误消息? 问题答案: 您可以按以下方式实现/ 阻止以检查元素是否存在: 或使用其中一种方法进行检查。它应该返回空列表或与传递的选择器匹配的元素列表,但如果没有找到元素,也不例外:

  • 问题内容: 有什么方法可以检查元素在纯JS(无jQuery)中是否可见? 因此,例如,在此页面中:PerformanceBikes,如果将鼠标悬停在Deals上(在顶部菜单上),则会显示一个交易窗口,但开始时未显示。它在HTML中,但不可见。 那么,给定一个DOM元素,我如何检查它是否可见?我试过了: 但它似乎不起作用。我想知道应该检查哪些属性。我想到: 还有其他我可能会想念的东西吗? 问题答案:

  • 有没有什么方法可以让我检查一个元素在纯JS(没有jQuery)中是否可见? 例如,在这个页面:Performance Bikes中,如果你将鼠标悬停在Deals(在顶部菜单上)上,就会出现一个Deals窗口,但一开始并没有显示出来。它在HTML中,但不可见。 那么,给定一个DOM元素,我如何检查它是否可见呢?我试过: 还有其他我可能失踪的吗?