web-dev-qa-db-ja.com

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

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

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

1225
Joan Venge

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]

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

1384
unbeknown

おそらく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']
554
Jarret Hardie

他の人が言ったようにpopとdelは与えられたインデックスの項目を削除するためのthe効率的な方法です。それでも、完成のためだけに(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]

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

これは、この方法を非常に非効率的にし、そしてそれはまた、(特に、他の変数が未修正のままである元のリストオブジェクトを指すときに)望ましくない副作用を生じる可能性がある。

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

これ Stack Overflowの回答では、スライスの概念について説明しています。

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

オブジェクトと一緒に使用している間、__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 )

これは__getitem__および__add__メソッドを定義するlistと連携します。

効率に関する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つの逆アセンブルのすべてで、基本的にreturn Noneである最後の2行を無視してください。最初の2行もグローバル値aindexをロードしています。

114
Raghav RV

pop はリストから項目を削除して保持するのにも役立ちます。 delが実際にアイテムを捨てるところ。

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

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

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

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

これはあなたがやりたいことによります。

削除した要素を返したい場合は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:])。

14
Neil Chowdhury

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

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]

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

削除したいアイテムを検索するだけでも構いません。それは本当に簡単です。例:

    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)

出力:a c d e

9
SollyBunny

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

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]
7
jitesh mohite

前述のように、ベストプラクティスは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()/ list内包表記を使ってこれを行うための「適切な」方法があるはずです。 

熟考

6
litepresence

あなたがリストのリストを使って作業しているようには思えないので、私はこれを短くします。それはリストである要素ではなく要素を削除するのでpopを使いたいのですが、それにはdelを使うべきです。 Pythonの最後の要素を呼び出すには "-1"です。

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

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

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]
6
Jo Ja

"del" 関数を使用します。 

del listName[-N]

たとえば、最後の3項目を削除したい場合、コードは次のようになります。

del listName[-3:]

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

del listName[-8:]
5
lloydyu24

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]]
5
xiaojia zhang

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

>>> 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]
1
Kopfgeldjaeger

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]
1
pyman

しかし、pop()をloop .itと共に使用してはいけません。ループなしでpop()を使用するとエラーが発生します。

0
DeV

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

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])
0
U9-Forward

インデックスに基づいてリストから要素を削除するには、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]
>>> 
0
Aashutosh jha