Pythonでインデックスからリストから要素を削除するにはどうすればよいですか?
list.remove
メソッドを見つけましたが、最後の要素を削除したいのですが、どうすればいいですか?デフォルトの削除ではリストが検索されるようですが、検索を実行したくありません。
O(n)
インデックスアクセスを使用しませんa[i]
(リンクリストのため)。注:配列ベースの実装はO(1)
インデックスアクセスを提供します。
Pythonでインデックスからリストから要素を削除するにはどうすればよいですか?
list.remove
メソッドを見つけましたが、最後の要素を削除したいのですが、どうすればいいですか?デフォルトの削除ではリストが検索されるようですが、検索を実行したくありません。
O(n)
インデックスアクセスを使用しませんa[i]
(リンクリストのため)。注:配列ベースの実装はO(1)
インデックスアクセスを提供します。
回答:
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]
これはチュートリアルのセクションです。
PyList_GetItem()
基本的に戻りますか((PyListObject *)op) -> ob_item[i];
- i
配列のth番目の要素。
あなたはおそらく望み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()
自体は非常に明白ですが、冗長であるためpop(-1)
正確に混乱する可能性があります。
pop
ほとんどのプログラミング言語の@ zx1986 a では、Pythonの場合と同様に、通常、最後の項目が削除されます。したがって、-1を指定するか、何も指定しないかは同じです。
pop()
削除した要素を返します。
他の人のように、ポップとデルは、指定されたインデックスのアイテムを削除する効率的な方法です。しかし、完了のために(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
。
a = a[:index] + a[index+1 :]
は、巨大なリストに関しては-trickが最も助かりました。他のすべてのメソッドはデッドロックに終わりました。ありがとうございました
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]]
これは、何をしたいかによります。
削除した要素を返す場合は、次を使用します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]
[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)
出力:acde
次のコードを使用して、リストから要素を削除します。
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()/リスト内包でこれを行うには「適切な」方法があるはずです。
熟考する
del()
か?その関数の場合、その関数の最初の引数としてリストを指定し、次にインデックスを指定するか、最初にインデックスを指定してからリストを指定しますか?アイテムなしでリスト引数を返すのか、それとも削除を行うのか。del
ステートメントについては知っていますが、同じ名前の関数については知りません。
リストのリストを操作しているようには思えないので、ここでは短くしておきます。リストの要素ではなく要素を削除するため、popを使用する必要があります。そのためには、delを使用する必要があります。Pythonの最後の要素を呼び出すには、「-1」です。
>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']
pop()
そしてdel
双方その要素がリスト自体であるか否かとは無関係に、設けられたインデックスにある要素を削除します。a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
リストから単一の要素を削除する方法と、さまざまなメソッドの利点についてはすでに説明しました。ただし、複数の要素を削除すると、エラーが発生する可能性があることに注意してください。
>>> 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]
または、複数のインデックスを削除する必要がある場合:
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]
>>>
O(n)
あります。これにより、タイムオペレーションが実行されます。deque()
両端で効率的な操作を提供しますが、途中でのO(1)挿入/ルックアップ/削除は提供しません。