2009-08-30 11 views
10

Javaで私はIteratorを使って、次にイテレータの.remove()メソッドを使って、イテレータによって返された最後の要素を削除することができます:Pythonでリストをトラバースするときに要素を削除する

import java.util.*; 

public class ConcurrentMod { 
    public static void main(String[] args) { 
     List<String> colors = new ArrayList<String>(Arrays.asList("red", "green", "blue", "purple")); 
     for (Iterator<String> it = colors.iterator(); it.hasNext();) { 
      String color = it.next(); 
      System.out.println(color); 
      if (color.equals("green")) 
       it.remove(); 
     } 
     System.out.println("At the end, colors = " + colors); 
    } 
} 

/* Outputs: 
red 
green 
blue 
purple 
At the end, colors = [red, blue, purple] 
*/ 

これをPythonでどうやってできますか? forループで繰り返し処理している間は、リストを変更できません。これは、スキップされる(here参照)ためです。そして、JavaのIteratorインタフェースに相当するようには見えません。

+0

Iのように行うことができます逆のイテレータを使用することが解決策になるのではないかと思います。これについての考えは?それはリストのコピーを作るよりも良いでしょう。 –

+0

http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python 尋ねられます。 –

答えて

18

反復を超えるコピー:あなたはフィルタ機能を使用することができ

for c in colors[:]: 
    if c == 'green': 
     colors.remove(c) 
+0

なぜ、色の代わりに色[:]を使用しますか? – hughdbrown

+4

'colors [:]'はコピーです(奇妙ですが、 'list(colors) 'のスペルをするために)。' .remove'呼び出しの影響を受けません。 –

+1

stdlibコピーモジュールのドキュメントがそれを参照しているからです。それにもかかわらず、私はまだコピー(またはおそらくcopy.copy(otherthing))のためにリスト(otherlist)を使うでしょう。 –

26

最善のアプローチは、古いものの[:]、例えばとして設定する、理想的listcompに、新しいリストを作ることである。いくつかの答えとして

colors[:] = [c for c in colors if c != 'green'] 

ませcolors =示唆するかもしれない - それだけ名前を再バインドし、最終的には古い "身体"に何か言及を残します。 colors[:] =はすべての点ではるかに優れています;-)。リストの

+1

リスト内包が最善の選択です。 – hughdbrown

+0

または colors = list(c!= 'green'の場合のcの色はc) – dugres

+0

@dugres:not quite:colors = list(...)は再バインドします。アレックスは、無駄なリストを記憶に残さないほうがいいという考えを主張しました。 – EOL

4

>>> colors=['red', 'green', 'blue', 'purple'] 
>>> filter(lambda color: color != 'green', colors) 
['red', 'blue', 'purple'] 
>>> 
0

か、また、この

>>> colors = ['red', 'green', 'blue', 'purple'] 
>>> if colors.__contains__('green'): 
...  colors.remove('green') 
+3

'' green 'in colors'に '.__ contains __()'を使う利点はありません –

+1

Plus、colors.remove ()は、すべてのオカレンスの代わりに* first *オカレンスだけを削除しました。 – EOL

+2

解決策は、 'green' colors:colors.remove( 'green')を介して働くことができます。もちろん、これはO(n ** 2)ですが、より良い解はO(n)です。 –

関連する問題