Pythonでインデックスからリストから要素を削除するにはどうすればいいですか?
list.remove
メソッドを見つけましたが、最後の要素を削除したいとします。どうすればよいですか。デフォルトのremoveがリストを検索するように見えますが、検索を実行したくありません。
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]
ここ はチュートリアルからのセクションです。
おそらく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']
他の人が言ったように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]
注: このメソッドはpop
やdel
のようにリストを変更することはありません。その代わりに、リストのコピーを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行もグローバル値a
とindex
をロードしています。
pop
はリストから項目を削除して保持するのにも役立ちます。 del
が実際にアイテムを捨てるところ。
>>> x = [1, 2, 3, 4]
>>> p = x.pop(1)
>>> p
2
通常、私は以下の方法を使用しています。
>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]
これはあなたがやりたいことによります。
削除した要素を返したい場合は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:]
)。
インデックスによってリストから要素を削除するさらに別の方法。
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
リストから要素を削除するには、次のコードを使用します。
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]
前述のように、ベストプラクティスは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内包表記を使ってこれを行うための「適切な」方法があるはずです。
熟考
あなたがリストのリストを使って作業しているようには思えないので、私はこれを短くします。それはリストである要素ではなく要素を削除するのでpopを使いたいのですが、それにはdelを使うべきです。 Pythonの最後の要素を呼び出すには "-1"です。
>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']
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]
"del" 関数を使用します。
del listName[-N]
たとえば、最後の3項目を削除したい場合、コードは次のようになります。
del listName[-3:]
たとえば、最後の8項目を削除する場合、コードは次のようになります。
del listName[-8:]
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]]
リストから単一の要素を削除する方法と、さまざまな方法の利点についてはすでに説明しました。ただし、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]
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]
しかし、pop()をloop .itと共に使用してはいけません。ループなしでpop()を使用するとエラーが発生します。
または複数のインデックスを削除する必要がある場合
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])
インデックスに基づいてリストから要素を削除するには、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]
>>>