【问题标题】:Put multiple items in a python queue将多个项目放入 python 队列
【发布时间】:2015-08-13 11:41:11
【问题描述】:

假设您有一个可迭代的items,其中包含应放入队列q 的项目。 当然你也可以这样:

for i in items:
    q.put(i)

但是感觉没必要把它写成两行——这应该是pythonic吗? 有没有办法做一些更具可读性的事情 - 即像这样

q.put(*items)

【问题讨论】:

  • 星号语法被一些人认为是魔法。 for 循环让大多数人清楚地知道发生了什么。
  • @StefanvandenAkker 我对这个论点的回答很晚:我认为可读性是非常主观的——我猜这类问题让我感到羞耻。但是话虽如此:用星号打包/解包参数的概念自从 - 我相信 2000 年代中期左右 - 以来一直是 python 的一部分 - 其他语言也有它。甚至 JavaScript 在 2015 年也采用了该概念及其扩展运算符 - 所以我认为它并没有那么不受欢迎。

标签: python queue


【解决方案1】:

使用内置的map函数:

map(q.put, items)

它会将q.put 应用于您列表中的所有项目。有用的单线。


对于 Python 3,您可以按如下方式使用它:

list(map(q.put, items))

也可以:

from collections import deque
deque(map(q.put, items))

但此时,for 循环更具可读性。

【讨论】:

  • 虽然我更喜欢它,但我不认为它真的很好 - 在 haskell 中会更好,但这只是我的口味。但主要问题是:这只适用于 python 2.x
  • @IARI,你也可以[q.put(i) for i in items]。但正如我在回答中指出的那样,我只会使用您在问题中的代码。
  • 为 python 3 支持编辑。
  • 谢谢 - 如果发现自己经常这样做(用地图组成列表)。但我认为它相当嘈杂,这有点违背了可读性的目的。与列表理解相同 - 我认为它不是真正可读的。这两个选项似乎有点滥用。
  • Comprehensions 和 map 用于您想要结果的时候,而不是作为单行 for 循环的一种方式;此外,在这种情况下,你可以只做for i in items: q.put(i)
【解决方案2】:

这有什么不明白的地方?

for i in items:
    q.put(i)

可读性不等于“短”,单行不一定更具可读性;很多时候情况正好相反。

如果您想拥有类似 q.put(*items) 的 API,请考虑制作一个简短的辅助函数,或子类化 Queue

【讨论】:

  • 虽然你说的很对,但短不等于可读,我想如果有人知道 python 一点q.put(*items) 会更具可读性,你不同意吗?最后,如果缩写的作用对有文化的读者来说是清楚的,那么较短的总是更易读。
  • @IARI,这没有什么问题,尽管在Queue.put 的情况下,由于阻塞,一次​​放置多个项目并不总是有意义的和超时。但是如果你想写一个辅助函数来为你做这件事(例如put_items(q, *items);或者在Queueq.put_items(*items)的子类中),我不会对此有任何异议。正如你所说,你甚至可以称它为put。请注意,我在回答中确实提到了这两个选项:)。
  • 我想我部分回应了你的问题,部分回应了 FunkySayu 对map(q.put, items) 的建议。
  • 对,我认为阻塞是一个更好的答案。我仍然觉得有点受宠若惊,因为“我们不会让你将可迭代对象放入队列中,因为你可能会忘记阻塞”......但这可能是标准 api 没有任何办法做到这一点的主要原因,对吗?
  • @IARI,我不知道是不是这个原因,但这是一个很好的理由,尤其是当你需要自己做非常微不足道的时候,而不是稍微制作 API更难使用(或更容易误用,视情况而定)。
【解决方案3】:
q.extend(items)

应该足够简单和Pythonic

如果你想排在最前面

q.extendleft(items)

Python 文档:

https://docs.python.org/2/library/collections.html#collections.deque.extend

【讨论】:

  • 队列类没有扩展方法
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多