14

Java では、次のように、 を使用してからイテレータIteratorのメソッドを使用して.remove()、イテレータによって返された最後の要素を削除できます。

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 ループで繰り返し処理している間、リストを変更することはできません。これは、内容がスキップされるためです (こちらを参照)。Iteratorまた、Javaのインターフェイスに相当するものはないようです。

4

4 に答える 4

30

Python での最善のアプローチは、理想的には listcomp で新しいリストを作成し、[:]古いリストの として設定することです。

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

一部colors =の回答が示唆するものとは異なります-それは名前を再バインドするだけで、最終的には古い「本体」への参照がぶら下がったままになります。colors[:] =すべての点ではるかに優れています;-)。

于 2009-08-30T02:26:57.367 に答える
24

リストのコピーを反復処理します。

for c in colors[:]:
    if c == 'green':
        colors.remove(c)
于 2009-08-30T02:26:57.397 に答える
4

フィルター機能を使用できます:

>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>
于 2009-08-30T02:57:35.790 に答える
0

またはあなたもこのようにすることができます

>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
...     colors.remove('green')
于 2009-08-30T04:34:40.797 に答える