作为循环中的FIFO列出

大家好,
我有一种算法,我需要在队列上使用循环
我在循环中推动值:
虽然不是(q.empty()):
x = q.get()
#Process X获取零或更多Y
#对于每个y:
Q.PUT(y)
我能做的最简单的事情是将列表用作队列,而正常
环形:
q = [a,b,c]
对于Q中的x:
#Process X获取零或更多Y
问:申请(y)
尽管它似乎有效,但这让我感到有些不舒服.这
问题是:它是保证工作的吗,还是Python期望您
不会在循环中更改列表吗?
问候,
Muhammad Alkarouri

# 回答1


Malkarouri Schreef:
如果可能的话,应避免在迭代时更改循环.
无论如何,对于这种使用而言,Deque更有效.我会用它
像这样:
从收藏品进口Deque
Q = Deque([A,B,C])
Q:
x = q.popleft()
#...
问:申请(y)
- -
现在生活中最可悲的方面是科学收集知识
比社会更快地聚集了智慧.
- 艾萨克·阿西莫夫(Isaac Asimov)
Roel Schroeven
# 回答2


Malkarouri写道:
我使用了完全相同的方法.我认为这很干净(甚至
优雅)解决方案.如果将来停止工作,我会感到惊讶
Python的实施,但我不知道这是否绝对可以保证.
邓肯
# 回答3


在3月8日,3:20*PM,Roel Schroeven
写道:
如果可能的话,应避免在迭代时更改循环.
无论如何,对于这种使用而言,Deque更有效.我会用它
像这样:
从收藏品进口Deque
Q = Deque([A,B,C])
Q:
* * * x = q.popleft()
* * *#...
* * * q.append(y)
- -
现在生活中最可悲的方面是科学收集知识
比社会更快地聚集了智慧.
* * - 艾萨克·阿西莫夫(Isaac Asimov)
Roel Schroeven
感谢您的答复.我的感觉,避免循环变量,但没有
明确的原因.
感谢您提醒我Deque,我从未使用过.
las,就效率而言 - 我需要 - 我真的不需要
将值弹出在列表/Deque上.
这一额外的步骤需要足够的时间来减慢循环的速度.所以是
这里不理想.
不过,为什么避免更改循环变量? python治疗循环吗
在列表上的列表不同于在迭代器上循环循环
不知道迭代器未来在循环运行时是否会更改?
问候,
Muhammad Alkarouri
# 回答4


在3月8日,3:52*PM,Duncan Smith 我使用了完全相同的方法. *我认为这很干净(甚至
优雅)解决方案. *如果将来停止工作,我会感到惊讶
Python的实施,但我不知道这是否绝对保证.
邓肯
谢谢邓肯,我想我会继续使用它.虽然是Python
教程在第4.2节中说了否则:
"修改在循环中迭代的序列是不安全的
(这只能用于可变序列类型(例如列表).如果
您需要修改您正在迭代的列表(FO r示例,
重复选定的项目)您必须在副本上迭代.".
更明确的是,在Python参考手册的7.3中:
"警告:当序列被修改时,有一个微妙的
循环(这仅适用于可变序列,即列表).一个
内部计数器用于跟踪接下来使用哪个项目,以及
这在每次迭代中都会增加.当这个柜台到达时
序列的长度终止.这意味着如果
套件从序列中删除电流(或以前的)项目,
下一个项目将跳过(因为它获得了当前项目的索引
已经被治疗了).同样,如果套件插入
当前项目之前的序列中的项目,当前项目将为
下次通过循环再次对待."
这可以解释为不要与过去一起玩.但是,部分
"当该计数器达到序列的长度时,循环
终止."可以解释为起始序列长度
或运行序列长度.
测试:
在[89]中:x =范围(4)
在[90]中:对于i在x:
....:打印我
....:X.Append(i+4)
....:如果我> = 8:休息
....::
....::
0
1
2
3
4
5
6
7
8
因此,这是运行序列长度.但是我仍然不确定是否那
保证.
问候,
Muhammad Alkarouri
# 回答5


在3月8日,9:43*AM,Malkarouri 我认为这是一种不好的做法.你打算做
"过程"再次跨越了添加的变量?如果没有,我会设置一个
根据您可怕的命名约定,新变量称为Z.
然后在for循环中使用z..append(y),然后在您离开之后
对于循环,q.append(z).
# 回答6


在3月8日,4:44*PM," Martinv.Löwis" ...
真的很感激,马丁.正是 *故意 *第一部分
很感兴趣.为我解决.
谢谢,
Muhammad Alkarouri
# 回答7


在3月8日上午9:43,Malkarouri 为什么不这样做呢?通过一些更改,它可以正常工作:
Q:
x = q.pop(0)
对于y的过程(x):
问:申请(y)
并考虑collections.deque for Q而不是列表
如果队列保持较小,则不应有很大的不同.
卡尔银行
# 回答8


3月8日,10:42*PM,Carl Banks 为什么不这样做呢? *通过一些更改,它可以正常工作:
Q:
* * x = q.pop(0)
* *对于y的过程(x):
* * * * q.append(y)
或(几乎)等效...
Q:
x = q.pop(0)
Q.Extend(Process(X))
- -
保罗·汉金

标签: python

添加新评论