2013-03-02 18 views
7

この動作が必要ですが、成長するリストではなくむしろリストが減少します。 この操作では、シーケンスの順序が重要です。繰り返し中にリストに追加する

for item in mylist: 
    if is_item_mature(item): 
     ## Process him 
    else: 
     ## Check again later 
     mylist.append(item) 

しかし、私はむしろこのようにしています。これは私の考えのように振る舞うか?どんな良い方法?

while mylist: 
    item = list.pop(0) 
    if is_item_mature(item): 
     ##Process 
    else: 
     mylist.append(item) 
+1

'list'は変数名の良い選択ではありません。 –

+0

はい、あなたのように動作するようです。しかし、あなたはそれが動作することを期待どおりに動作しますか? –

+0

すべてはうまくいくようですが、ちょっとした問題は、最後の項目のいくつかでデッドロックが発生したことだけでした(私のデータセットの一部が間違っていました)。デバッガはキューを捕まえてその尾を追いかける。 – user2097818

答えて

6

私はあなたのアプローチで見る唯一の問題は、使用状況に応じて、することは、私はむしろ、あなたがQueueを使用することをお勧め

あなたのメモリを食べることができる成長のリストです。キューは、生産終了と消費終了の両方を処理するのに十分な柔軟性を備えています。

from Queue import Queue 
q = Queue() #You can also specify the maximum size of the Queue here 
# Assume your Queue was filled 
while not q.empty(): 
    # It won;t block if there are no items to pop 
    item = q.get(block = False) 
    if is_item_mature(item): 
     #process 
    else: 
     #In case your Queue has a maxsize, consider making it non blocking 
     q.put(item) 
+0

+1キューが行く方法です!良い例もあります –

+0

私はこれも好きだと思います。私のループの処理は、現時点では少し原油であり、厳密なシーケンシングは当分の間、いくつかの余分なコードから私を救う。 – user2097818

+0

'Queue.Queue'はマルチスレッド用です。これを必要としない場合は、単に 'collections.deque'を使用してください。これはQueueで内部的に使用されています。 – koddo

5

あなたが安全に、リストに項目を追加することができ、かつ反復はそれらの項目が含まれます:あなたは漸減リストを好むならば、あなたのwhileループはあなたのニーズに完璧に適している、しかし

>>> lst = range(5) 
>>> for i in lst: 
...  print i 
...  if i < 3: 
...   lst.append(i + 10) 
... 
0 
1 
2 
3 
4 
10 
11 
12 

を。

+0

これは安全で、そのように機能することをどのように知っていますか?それはどこかに書かれていますか?私はこれについて長年の証拠を見つけようとしてきました... –

+0

@StefanPochmann:どうやって知っていますか?リストの経験と知識、イテレーターの実装の詳細をリストします。それは明示的に文書化されていません。 –

+0

@StefanPochmann: 'iter(list)'によって返されるリストイテレータは、現在の位置(整数)とリストへの参照を格納します。次の要素を取得するたびに現在の位置が現在のリストのサイズと比較され、小さい場合は現在の位置の項目がリストから取得され、位置がインクリメントされ、取得された項目が返されます。 –

関連する問題