リストの削除、削除、ポップの違い


928
>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>> 

リストから要素を削除する上記の3つの方法の間に違いはありますか?


1
データ構造を設定するための同様の行の関連する投稿-Pythonのset.discardメソッドとset.removeメソッドの実行時の違い?
RBT、

回答:


1332

はい、特定のインデックスではなくremove最初に一致した値を削除します。

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

del 特定のインデックスにあるアイテムを削除します。

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

そしてpop、特定のインデックスを返すことにある項目を削除します。

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

エラーモードも異なります。

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

14
@jxramos:del構文ホールドオーバーではありません。returnor ifまたはと同様に、構文は変更されていませんwhile
Martijn Pieters

6
ユーザーがリストを繰り返し処理し、繰り返し処理を行うと同時にこれらの関数を使用する場合は注意が必要です。
ハマニー

16
このdel例はやや誤解を招くものです。正確にどの要素が削除されますか?2番目か3番目か?あなたが使用している必要があり[9, 8, 7, 6]del a[1]そして[9, 7, 6]
gromit190

2
@ rite2hhh等しいかどうかをテストします。等価性テストは、最適化として最初に同一性をテストします
Martijn Pieters

1
@ rite2hhh:値の等価性は式リファレンスで説明されています
Martijn Pieters

184

使用しdel、インデックスで要素を削除するにはpop()、あなたが返された値が必要な場合は、インデックスによってそれを削除して、remove()値によって要素を削除します。後者はリストを検索する必要ValueErrorがあり、そのような値がリストにない場合に発生します。

要素のiリストからインデックスを削除する場合n、これらのメソッドの計算の複雑さは

del     O(n - i)
pop     O(n - i)
remove  O(n)

1
popはリストの検索を必要としますか
sachin irukula 12/07/17

31
+1は複雑さの内訳です。要素がリストの最後にあるときに、削除とポップがどのように一定であるかを示します。
Big Sharpie 2014年

2
覚えておいてください...インデックスに基づくものはすべてワンショットO(n-1)です...(値で)ルックアップを行う必要がある場合、要素が見つかるまでコレクションを走査します。
Pepito Fernandez

2
@PepitoFernandezリスト内のインデックスによるルックアップは、PythonではO(1)です。(PythonのリストはC ++のベクトルに似ています。)
Sven Marnach '14

3
@PlasmaBinturongパフォーマンスが重要であることを証明するデータがない限り、より読みやすいと思うものを使用する必要があります。そして、もしそうなら、あなたはあなたの特定のケースで何がより速いかを測定する必要があります。私の推測でdelは少し高速ですが、別の理由もあります__delitem__。Cで実装された型の検索は、名前ではなくインデックスによってpop行われますが、記述子プロトコル全体に従って検索する必要があります。関数自体の実行にも同じ時間がかかるはずです。どちらもポインタを返します– 1つは削除されたオブジェクトへ、もう1つはへNone
Sven Marnach

92

他の誰もそれについて言及していないので、del(とは異なりpop)リストのスライスのためにインデックスの範囲を削除できることに注意してください:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

これによりIndexError、インデックスがリストにない場合でもを回避できます。

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]

55

すでに他の人からかなりよく答えられました。これは私の端から:)

削除vsポップvsデル

明らかに、popは値を返すremove唯一のものであり、オブジェクトを検索する唯一のものでありdel、単純な削除に限定されます。


2
Thnx!1つの注意:Pythonでは、リストの実装方法が原因で(実際には配列があります...!)、「そのノードの位置まで
進む

19

pop-インデックスを取り、値を返します

remove-値を取り、最初の出現を削除し、何も返しません

delete-インデックスを取得し、そのインデックスの値を削除して、何も返しません


19

多くの最良の説明がここにありますが、もっと簡単にするために最善を尽くします。

これらすべてのメソッドの中で、reverse&popはpostfixで、deleteはprefixです。

remove():最初に出現した要素を削除するために使用されていました

remove(i) => i値の最初の出現

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]

pop():次の場合に要素を削除するために使用されます:

不特定

pop() =>リストの最後から

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

指定された

pop(index) =>インデックスの

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

警告:危険な方法が先にあります

delete():そのプレフィックスメソッド。

同じメソッドの2つの異なる構文に注意してください:[]と()。それは以下の能力を持っています:

1.インデックスを削除する

del a[index] => popと同じように、インデックスとそれに関連する値を削除するために使用されます。

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2.範囲内の値を削除する[インデックス1:インデックスN]

del a[0:3] =>範囲内の複数の値

>>>del a[0:3]
>>>a
[6, 5]

3.最後ではなくリスト、リスト全体を一度に削除する

del (a) =>上記のとおり。

>>>del (a)
>>>a

混乱があれば明確にしてください。


2

さまざまなデータ構造に対する操作/関数は、特定のアクションに対して定義されます。ここであなたの場合すなわち要素の削除、削除、ポップ、削除。(セットを検討する場合は、別の操作を追加-破棄)他の混乱するケースは、追加中です。挿入/追加。デモンストレーションのために、dequeを実装しましょう。dequeはハイブリッド線形データ構造であり、両端から要素を追加/削除できます(リアエンドとフロントエンド)。

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

ここでは、操作を参照してください:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

オペレーションは何かを返さなければなりません。だから、ポップ-インデックスの有無にかかわらず。値を返したくない場合:del self.items [0]

インデックスではなく値で削除:

  • 削除する :

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez

[1,3,5,7]を返します

セットの場合を考えてみましょう。

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.

1

上記のコメントに記載されているように、popとdeleteはどちらもインデックスを使用して要素を削除します。主な違いは、それらの時間の複雑さです。インデックスのないpop()の時間の複雑さはO(1)ですが、最後の要素の削除の場合とは異なります。

ユースケースが常に最後の要素を削除することである場合は、常にdelete()よりもpop()を使用することをお勧めします。時間の複雑さの詳細については、https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txtを参照してください。


2
これはいくつかの点で間違っています。のような方法はありませんdelete。違いはpop、値を返すことと、delスライスで機能することです。がpop機能する場合、del計算の複雑度はまったく同じです(定数項の方がわずかに高速です)。
abarnert 2018年

1

リストの削除操作には、削除する値が与えられます。リストを検索してその値を持つアイテムを見つけ、最初に一致したアイテムを削除します。一致するアイテムがない場合はエラーで、ValueErrorが発生します。

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

デルのステートメントは、リスト全体を削除するために使用することができます。delへの引数として特定のリストアイテムがある場合(たとえば、リストの8番目のアイテムを具体的に参照するlistname [7])、そのアイテムを削除します。リストから「スライス」を削除することも可能です。インデックスが範囲外の場合はエラーで、IndexErrorが発生します

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

popの通常の使用法は、リストをスタックとして使用するときにリストから最後の項目を削除することです。delとは異なり、popはリストからポップした値を返します。オプションで、リストの最後以外からポップおよびポップするインデックス値を指定できます(たとえば、listname.pop(0)はリストから最初のアイテムを削除し、その最初のアイテムを結果として返します)。これを使用してリストをキューのように動作させることができますが、pop(0)よりも優れたパフォーマンスでキュー操作を提供できるライブラリルーチンがあります。インデックスが範囲外の場合はエラーで、IndexErrorが発生します

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

詳細については、collections.dequeを参照してください。


-1

削除は基本的に値に対して機能します。インデックスの削除およびポップ作業

削除は基本的に最初に一致した値を削除します。Deleteは特定のインデックスからアイテムを削除します。Popは基本的にインデックスを取得し、そのインデックスの値を返します。次にリストを印刷するとき、値は表示されません。

例:


3
回答ありがとうございますが、他の回答に加えて付加価値を提供する方がよいでしょう。この場合、他のユーザーが回答に含まれているすべてをカバーしているため、回答は追加の価値を提供しません。2番目の問題として、テキストとして貼り付けることができる場合は、テキストを画像として含めないでください。以前の回答が参考になった場合は、投票してください
David Buck

-3

removeを使用して、インデックスによって値を削除することもできます。

n = [1, 3, 5]

n.remove(n[1])

nは[1、5]を参照します


43
試してみてくださいn = [5, 3, 5]、その後、n.remove(n[2])
abarnert 2014

@abarnertのユースケースは、以下のケースn = [5,3,5]と同期して機能し、n.remove(5)になります。これらはどちらも、最初に遭遇した要素をリストから削除します。
Akhil Ghatiki

@AkhilGhatiki n.remove(n[2])は削除しますがn[0]、削除しませんn[2]。したがって、それは理由のない単なる線形時間ではなく(N = 3の場合は大したことではないかもしれません)、それも間違っています(Nが何であっても大したことです)
18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.