0

たとえば、リストがあります:

L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]

そして、リストからすべての 1 を削除したいので、次のようになります。

L = [2, 2, 3, 6, 10, 3]

リストを繰り返し処理してから、削除したい要素(この場合は1)と等しい場合は要素を削除しようとしましたが、リストを台無しにするため、リストからのものを同時に繰り返し削除することはできません。数えます。私が思いついた最善の方法は、1 をまったく含まない新しいリスト L2 を作成し、それを L に入れることですが、L を変更するだけの解決策はありますか?

4

4 に答える 4

5

しかし、Lを変異させるだけの解決策はありますか?

List- のコピーを繰り返し処理し、L[:]から要素を削除できますL。これでカウントが乱れることはありません。

本当に新しいリストを作成したくない場合は、を使用して逆に反復する必要がありますがrange(len(L) - 1, -1, -1)、それはもはや「Pythonic」ではありません。

>>> for x in L[:]:  
...     if x == 1:
...         L.remove(x)
... 
>>> L
[2, 2, 3, 6, 10, 3]

ただし、 List Comprehensionも使用できます。

>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L[:] = [x for x in L if x != 1]
>>> L
[2, 2, 3, 6, 10, 3]
于 2013-07-28T14:15:31.390 に答える
1

組み込みのフィルターを使用する:

>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> filter(lambda x: x is not 1, L)
[2, 2, 3, 6, 10, 3]

または、次の場所に割り当てることもできますL:

>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L = filter(lambda x: x is not 1, L)
>>> L
[2, 2, 3, 6, 10, 3]

この概念をメソッドにラップして、含める/除外する項目のリストを指定することもできます。

def exclude(collection, exclude_list):
    return filter(lambda x: x not in exclude_list, collection)

def include(collection, include_list):
    return filter(lambda x: x in include_list, collection)

>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L = exclude(L, [1])
>>> L
[2, 2, 3, 6, 10, 3]
于 2013-07-28T14:17:29.803 に答える