0

これに似た質問はたくさんあります (ここに 1 つ) がありますが、私が見た解決策ではリスト内包表記またはフィルターを使用し、それらの方法で新しいリスト (または Python 3.x のフィルターの場合は新しいイテレーター) を生成します。リスト自体を変更してインスタンスを削除するソリューション ( thisthis など) があり、それらは私の最後の手段です。ただし、よりエレガントな(別の質問で「Pythonic」と呼ばれる)方法があるかどうかを確認するよう求めています。

新しいリストを生成するソリューションを無視している理由: リストのコレクションを繰り返し処理しています。Python では、繰り返し処理している「現在の」リストを変更できますが、完全に置き換えることはできません。

>>> ll= [[1,2,3], [2,3,4], [4,5,6]]

>>> for l in ll:
        if l[0] == 2:
            l = [10]
>>> ll
[[1, 2, 3], [2, 3, 4], [4, 5, 6]]   #replacement didn't happen

>>> for l in ll:
        if l[0] == 2:
            l.remove(2)
>>> ll
[[1, 2, 3], [3, 4], [4, 5, 6]]   #modification succeeded 
4

1 に答える 1

6

リスト自体ではなく、すべてのリスト要素を置き換えるには、スライス割り当てを使用する必要があります。

for l in ll:
    if l[0] == 2:
        l[:] = [10]

[:]パーツはこれをスライス割り当てに変換します。への参照lポイントを置き換える代わりに、に含まれるすべての要素を新しいリストに置き換えます。 l

デモ:

>>> ll= [[1,2,3], [2,3,4], [4,5,6]]
>>> for l in ll:
...     if l[0] == 2:
...         l[:] = [10]
... 
>>> ll
[[1, 2, 3], [10], [4, 5, 6]]
于 2013-04-09T07:41:30.827 に答える