4

333以下のリストから両方の出現を削除するにはどうすればよいですか?

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]

Python 2.7コマンドラインで以下のスクリプトを入力しました

for num in a:
    if num == 333:
       a.remove(num)

ただし、最初に出現したものだけ333が削除されます

 >>> a
 [-1, 1, 66.25, 333, 1234.5]

同じ要素の出現をすべて削除する方法は? すべての出現を削除する要素を指定し、同じ名前または別の名前で新しいリストを取得できるようにしたい

4

4 に答える 4

7

ここでリスト内包表記を使用します。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> [item for item in a if item != 333]
[-1, 1, 66.25, 1234.5]

リストを反復しながらリストを変更しているため、あなたのアプローチは機能しませんでした。

for num in a[:]:  #iterate over a shallow copy
    if num == 333:
       a.remove(num)

一意のアイテムだけのリストを取得するには、セットを使用します。

>>> seen = set()
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> [item for item in a if item not in seen and not seen.add(item)]
[-1, 1, 66.25, 333, 1234.5]

順序が重要でない場合:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> list(set(a))
[66.25, 1, 333, -1, 1234.5]
于 2013-09-05T06:14:41.787 に答える
6

要素を削除する方法を尋ねられたので、リストをスライスとして再割り当てします。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> a[:] = [item for item in a if item != 333]

これにより、メモリ内に新しいリストが作成されます。通常はこれで問題ありませんが、 を呼び出さずremoveにこれを回避したい場合は、同じアイテムに対して複数回チェックが行われます。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> for i in range(len(a) - 1, -1, -1):  # iterate over reversed indices's
>>>     if a[i] == 333:
>>>         del a[i]

これには、最後の項目を最初に削除するという利点があります (CPython ではより高速です)。

Python のリストの先頭から中間にある項目を削除することは、あまり最適ではないことに注意してください。どちらの方法 (del list[index]またはlist.remove) を使用しても、リストが大きく、多くの項目を削除する必要がある場合、これは Python がリストのサイズを大幅に変更する必要があることを意味します。その場合、リスト内包表記を使用して新しいリストを作成することをお勧めします。

于 2013-09-05T06:25:25.997 に答える
4

ここであなたが欲しいのはこのようなものだと思います

a = [-1, 1, 66.25, 333, 333, 1234.5]
a = [el for el, count in collections.Counter(a).items() if count == 1]

これにより、複数回出現する場合、値のリストから要素が削除されます。

于 2013-09-05T06:26:27.950 に答える
0

次のコードでは、[5,3,4,7,8,4] リストから番号 4 が削除されます

>>> def pp(x):
...     if x==4:
...             return False
...     else:
...             return True
... 
>>> filter(pp, [5,3,4,7,8,4])

出力

[5, 3, 7, 8]
于 2013-09-05T06:58:48.527 に答える