添加到 Python 中迭代的双端队列?
Add to a deque being iterated in Python?
我正在迭代 Python 中的双端队列。有时双端队列会在我进行交互时发生变化,这会产生 RuntimeError: deque mutated during iteration
.
如果这是一个 Python 列表而不是双端队列,我将只遍历列表的一个副本(通过像 my_list[:]
这样的切片,但由于不能使用切片操作在 deques 上,我想知道最 Pythonic 的处理方式是什么?
我的解决方案是导入复制模块,然后迭代一个副本,比如 for item in copy(my_deque):
这很好,但是由于我对这个主题进行了高低搜索,我想我会 post在这里问?
您可以通过创建列表来"freeze"。没有必要将它复制到一个新的双端队列。一个列表当然就足够了,因为你只需要它来迭代。
for elem in list(my_deque):
...
list(x)
从任何可迭代对象 x
创建一个列表,包括双端队列,在大多数情况下,这是最符合 pythonic 的方式。
切记,只有在同一线程中(即在循环内)修改双端队列时,此解决方案才有效。否则,请注意 list(my_deque)
不是原子的,并且也在遍历双端队列。这意味着如果另一个线程在运行时更改双端队列,您最终会遇到同样的错误。如果您处于多线程环境中,请使用锁。
虽然您可以从双端队列中创建一个列表,for elem in list(deque)
,但如果它是一个经常使用的函数,这并不总是最佳的:它会带来性能成本,尤其是。如果双端队列中有大量元素,并且您不断将其更改为 array
结构。
无需创建列表的可能替代方法是使用 while
循环和一些布尔变量来控制条件。这提供了 O(1) 的时间复杂度。
我正在迭代 Python 中的双端队列。有时双端队列会在我进行交互时发生变化,这会产生 RuntimeError: deque mutated during iteration
.
如果这是一个 Python 列表而不是双端队列,我将只遍历列表的一个副本(通过像 my_list[:]
这样的切片,但由于不能使用切片操作在 deques 上,我想知道最 Pythonic 的处理方式是什么?
我的解决方案是导入复制模块,然后迭代一个副本,比如 for item in copy(my_deque):
这很好,但是由于我对这个主题进行了高低搜索,我想我会 post在这里问?
您可以通过创建列表来"freeze"。没有必要将它复制到一个新的双端队列。一个列表当然就足够了,因为你只需要它来迭代。
for elem in list(my_deque):
...
list(x)
从任何可迭代对象 x
创建一个列表,包括双端队列,在大多数情况下,这是最符合 pythonic 的方式。
切记,只有在同一线程中(即在循环内)修改双端队列时,此解决方案才有效。否则,请注意 list(my_deque)
不是原子的,并且也在遍历双端队列。这意味着如果另一个线程在运行时更改双端队列,您最终会遇到同样的错误。如果您处于多线程环境中,请使用锁。
虽然您可以从双端队列中创建一个列表,for elem in list(deque)
,但如果它是一个经常使用的函数,这并不总是最佳的:它会带来性能成本,尤其是。如果双端队列中有大量元素,并且您不断将其更改为 array
结构。
无需创建列表的可能替代方法是使用 while
循环和一些布尔变量来控制条件。这提供了 O(1) 的时间复杂度。