インデックスによってリストから要素を削除する方法


1506

Pythonでインデックスからリストから要素を削除するにはどうすればよいですか?

list.removeメソッドを見つけましたが、最後の要素を削除したいのですが、どうすればいいですか?デフォルトの削除ではリストが検索されるようですが、検索を実行したくありません。


10
@smci:Pythonリストは配列ベースです。中央のアイテムを削除するには、右側のすべてのアイテムを移動してギャップを削除する必要がO(n)あります。これにより、タイムオペレーションが実行されます。deque()両端で効率的な操作を提供しますが、途中でのO(1)挿入/ルックアップ/削除は提供しません。
jfs

@JFSebastian:cPython実装、はい、訂正してくれてありがとう。厳密に言えば、言語仕様はリストの実装方法を指定していません。別の実装ではリンクリストの使用を選択できます。
smci

@smci:実用的なPythonの実装では、O(n)インデックスアクセスを使用しませんa[i](リンクリストのため)。注:配列ベースの実装はO(1)インデックスアクセスを提供します。
jfs 2016

@JFSebastian:もちろんです。言語仕様ではこれが定義されてないことに注意しましこれは実装の問題です。(私はそれがそうでなかったことを知って驚いた。)
smci

@smciを広範囲にターゲットにしている場合、どのように最適化できるかはわかりません。
Nick T

回答:


1740

del削除する要素のインデックスを使用して指定します。

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]

スライスもサポート:

>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]

これはチュートリアルのセクションです。


53
ありがとう、popとdelの違いは何ですか?
Joan Venge

37
delはオーバーロードされています。たとえば、del aはリスト全体を削除します
Brian R.Bondy、

34
別の例del a [2:4]は要素2と3を削除します
ブライアンR.ボンディ

307
pop()は、削除する要素を返します。デルは削除するだけです。

13
そこに「リンクされたリスト」の証拠が見当たりません。svn.python.org/projects/python/trunk/Objects/listobject.cを見て、どのようにPyList_GetItem()基本的に戻りますか((PyListObject *)op) -> ob_item[i];- i配列のth番目の要素。
glglgl 2013

649

あなたはおそらく望みpopます:

a = ['a', 'b', 'c', 'd']
a.pop(1)

# now a is ['a', 'c', 'd']

デフォルトでは、 popは、引数なしで最後のアイテムを削除します。

a = ['a', 'b', 'c', 'd']
a.pop()

# now a is ['a', 'b', 'c']

105
pop(-1)を忘れないでください。はい、それがデフォルトですが、私はそれを好むので、どのエンドポップがデフォルトで使用するか覚えておく必要はありません。
S.Lott、2009年

282
同意しません。プログラマーの「ポップ」の語源(「スタック」データ構造のトップを削除して戻す操作)を知っている場合、それpop()自体は非常に明白ですが、冗長であるためpop(-1)正確に混乱する可能性があります。
coredumperror 2013

最後のものを削除するにはa.pop(-1)?
zx1986 2013

14
popほとんどのプログラミング言語の@ zx1986 a では、Pythonの場合と同様に、通常、最後の項目が削除されます。したがって、-1を指定するか、何も指定しないかは同じです。
Pascal

30
ちなみに、pop()削除した要素を返します。
Bob Stein

136

他の人のように、ポップとデルは指定されたインデックスのアイテムを削除する効率的な方法です。しかし、完了のために(Pythonでは多くの方法で同じことができるため):

スライスの使用(これは元のリストからのアイテムのインプレース削除を行いません):

(また、これはPythonリストを操作するときに最も効率の悪い方法ですが、これはpopをサポートしていないがを定義しているユーザー定義オブジェクトを操作するときに役立ちます(ただし、効率的ではありません__getitem__)。

>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index

>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]

注:このメソッドはpop、やのようにリストを変更しないことに注意してくださいdel。代わりに、リストの2つのコピーを作成し(1つは最初からインデックスまで、それなし(a[:index])と、インデックスの後から最後の要素まで(a[index+1:]))、両方を追加して新しいリストオブジェクトを作成します。これはリスト変数(a)に再度割り当てられます。したがって、古いリストオブジェクトは逆参照され、ガベージコレクションされます(元のリストオブジェクトがa以外の変数によって参照されていない場合)。

これにより、このメソッドは非常に非効率になり、望ましくない副作用が発生する可能性があります(特に、他の変数が変更されていない元のリストオブジェクトを指している場合)。

これを指摘してくれた@MarkDickinsonに感謝します...

このスタックオーバーフローの回答は、スライスの概念を説明しています。

また、これは正のインデックスでのみ機能することにも注意してください。

オブジェクトで使用する場合、__getitem__メソッドは定義されている必要があり、さらに重要なことに、__add__両方のオペランドからのアイテムを含むオブジェクトを返すようにメソッドが定義されている必要があります。

本質的に、これは次のようなクラス定義を持つすべてのオブジェクトで機能します。

class foo(object):
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return foo(self.items[index])

    def __add__(self, right):
        return foo( self.items + right.items )

これは、listどの定義__getitem____add__メソッドで機能します。

効率に関する3つの方法の比較:

以下が事前定義されていると想定します。

a = range(10)
index = 3

del object[index]方法:

はるかに効率的な方法です。これは、__del__メソッドを定義するすべてのオブジェクトで機能します。

分解は次のとおりです。

コード:

def del_method():
    global a
    global index
    del a[index]

分解:

 10    0 LOAD_GLOBAL     0 (a)
       3 LOAD_GLOBAL     1 (index)
       6 DELETE_SUBSCR   # This is the line that deletes the item
       7 LOAD_CONST      0 (None)
      10 RETURN_VALUE
None

pop 方法:

これは、delメソッドよりも効率が悪く、削除されたアイテムを取得する必要がある場合に使用されます。

コード:

def pop_method():
    global a
    global index
    a.pop(index)

分解:

 17     0 LOAD_GLOBAL     0 (a)
        3 LOAD_ATTR       1 (pop)
        6 LOAD_GLOBAL     2 (index)
        9 CALL_FUNCTION   1
       12 POP_TOP
       13 LOAD_CONST      0 (None)
       16 RETURN_VALUE

スライスと追加のメソッド。

最も効率が悪い。

コード:

def slice_method():
    global a
    global index
    a = a[:index] + a[index+1:]

分解:

 24     0 LOAD_GLOBAL    0 (a)
        3 LOAD_GLOBAL    1 (index)
        6 SLICE+2
        7 LOAD_GLOBAL    0 (a)
       10 LOAD_GLOBAL    1 (index)
       13 LOAD_CONST     1 (1)
       16 BINARY_ADD
       17 SLICE+1
       18 BINARY_ADD
       19 STORE_GLOBAL   0 (a)
       22 LOAD_CONST     0 (None)
       25 RETURN_VALUE
None

注:3つすべての逆アセンブルでは、基本的には最後の2行は無視されますreturn None。また、最初の2行はグローバル値aとをロードしていますindex


4
スライシングメソッドはリストから要素を削除しません。代わりに、元のリストからi番目のエントリ以外をすべて含む新しいリストオブジェクトを作成します。元のリストは変更されません。
マークディキンソン

@MarkDickinson同じことを明確にするために回答を編集しました...今、見栄えが良かったら教えてください。
Raghav RV 2014

6
多分答えは完全にトピックではなかったかもしれませんが、タプルなどの不変オブジェクトから項目を省略する必要がある場合は、インデックス作成方法が役立ちます。その場合、pop()とdel()は機能しません。
カレブ2014

6
投稿全体で提示されたすべてのメソッドの中で@ rvraghav93 a = a[:index] + a[index+1 :]は、巨大なリストに関しては-trickが最も助かりました。他のすべてのメソッドはデッドロックに終わりました。ありがとうございました
user3085931

3
確かにマーク、あなたは不機嫌です。この答えは本当に教育的だったので私が好んだ答えです。私はこの回答と、提供された分解の詳細とパフォーマンスへの影響からほとんどを学びました。加えて、スライシングメソッドでは、はい、別のオブジェクトを作成しますが、今ではそれが指定されており、必要な場合もあります。
Yohan Obadia

52

popリストからアイテムを削除して保持するのにも便利です。del実際にアイテムを破棄する場所。

>>> x = [1, 2, 3, 4]

>>> p = x.pop(1)
>>> p
    2

24

2番目、3番目、7番目など、リスト内の特定の位置要素を削除する場合。使えない

del my_list[2]
del my_list[3]
del my_list[7]

2番目の要素を削除した後、実際に削除する3番目の要素は、元のリストの4番目の要素です。以下のように、元のリストの2番目、3番目、7番目の要素をフィルタリングして、新しいリストを取得できます。

new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]

19

これは、何をしたいかによります。

削除した要素を返す場合は、次を使用しますpop()

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

ただし、要素を削除するだけの場合は、次を使用しますdel

>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]

さらに、delスライス(例:)を使用できますdel[2:]


18

通常、私は次の方法を使用しています。

>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]

15

インデックスによってリストから要素を削除するさらに別の方法。

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# remove the element at index 3
a[3:4] = []
# a is now [0, 1, 2, 4, 5, 6, 7, 8, 9]

# remove the elements from index 3 to index 6
a[3:7] = []
# a is now [0, 1, 2, 7, 8, 9]

[X:Y]のインデックスからの要素をポイントxしますy-1。リストのその部分を空のリスト([])として宣言すると、それらの要素は削除されます。


14

削除するアイテムを検索するだけです。とても簡単です。例:

    letters = ["a", "b", "c", "d", "e"]
    letters.remove(letters[1])
    print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer)

出力:acde


6
私はこのソリューションが好きですが、もちろん、リストに重複がないことを前提としています。
tommy.carstensen

11

次のコードを使用して、リストから要素を削除します。

list = [1, 2, 3, 4]
list.remove(1)
print(list)

output = [2, 3, 4]

リストからインデックス要素データを削除したい場合は、以下を使用します。

list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]

2
リストに重複を含めることはできないという警告が付属しています。
tommy.carstensen

3
これはインデックスによる削除ではなく、一致する値による削除です。これは、ここを訪れる一部の人にとっては貴重な情報になるかもしれませんが、OPの質問にはまったく答えようとしません。
Anthon 2018

8

前述のように、ベストプラクティスはdel();です。または値を知る必要がある場合はpop()。

代替ソリューションは、必要な要素のみを再スタックすることです。

    a = ['a', 'b', 'c', 'd'] 

    def remove_element(list_,index_):
        clipboard = []
        for i in range(len(list_)):
            if i is not index_:
                clipboard.append(list_[i])
        return clipboard

    print(remove_element(a,2))

    >> ['a', 'b', 'd']

eta:うーん...負のインデックス値では機能せず、熟考して更新します

私は考えます

if index_<0:index_=len(list_)+index_

パッチを当てます...しかし、突然、このアイデアは非常にもろく見えます。興味深い思考実験ですが。append()/リスト内包でこれを行うには「適切な」方法があるはずです。

熟考する


1
Pythonのどのバージョンに関数がありますdel()か?その関数の場合、その関数の最初の引数としてリストを指定し、次にインデックスを指定するか、最初にインデックスを指定してからリストを指定しますか?アイテムなしでリスト引数を返すのか、それとも削除を行うのか。delステートメントについては知っていますが、同じ名前の関数については知りません。
Anthon 2018

8

リストのリストを操作しているようには思えないので、ここでは短くしておきます。リストの要素ではなく要素を削除するため、popを​​使用する必要があります。そのためには、delを使用する必要があります。Pythonの最後の要素を呼び出すには、「-1」です。

>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']

1
pop()そしてdel双方その要素がリスト自体であるか否かとは無関係に、設けられたインデックスにある要素を削除します。a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
Anthon、

8

l-値のリスト。inds2remリストからインデックスを削除する必要があります。

l = range(20)
inds2rem = [2,5,1,7]
map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x))

>>> l
[0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

動作していない、答えは<map at 0x7f4d54109a58>です。lはrange(0,20)
Hitesh

7

「del」関数を使用します。

del listName[-N]

たとえば、最後の3つのアイテムを削除する場合、コードは次のようになります。

del listName[-3:]

たとえば、最後の8つのアイテムを削除する場合、コードは次のようになります。

del listName[-8:]

2
delある文は。関数の場合は、次のように記述する必要がありますdel(listame[-N])
Anthon

7

リストから単一の要素を削除する方法と、さまざまなメソッドの利点についてはすでに説明しました。ただし、複数の要素を削除すると、エラーが発生する可能性があることに注意してください。

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in indices:
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 7, 9]

元のリストの要素3と8(3と7ではない)が削除されました(ループ中にリストが短縮されたため)。これは意図されていなかった可能性があります。複数のインデックスを安全に削除したい場合は、次のように、最初に最高のインデックスを持つ要素を最初に削除する必要があります。

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in sorted(indices, reverse=True):
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 8, 9]

4

または、複数のインデックスを削除する必要がある場合:

print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])

もちろん、そうすることもできます:

print([v for i,v in enumerate(your_list) if i != unwanted_index])

1
インデックスのリストを逆の順序で並べ替えてから、1つずつ削除してみませんか?そうすれば、新しいリストを作成する必要はありません。
Anthon 2018

3

delまたはpopを使用して、インデックスに基づいてリストから要素を削除できます。Popはリストから削除するメンバーを印刷しますが、リストはそのメンバーを印刷せずに削除します。

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

3

delまたはpopを使用できますが、インデックスとスライスを指定して、ユーザーがデータをより詳細に制御できるようにするため、私はdelを使用します。

たとえば、表示されたリストから始めて、最後の要素をdelスライスとして削除し、次にを使用して結果から最後の要素を削除できpopます。

>>> l = [1,2,3,4,5]
>>> del l[-1:]
>>> l
[1, 2, 3, 4]
>>> l.pop(-1)
4
>>> l
[1, 2, 3]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.