Cum pot elimina un element dintr-o listă de index în Python?
Am găsit lista.elimina metoda, dar spun că vreau pentru a elimina ultimul element, cum fac acest lucru? Se pare ca implicit elimina căutările lista, dar eu nu't vreau nici o căutare pentru a fi efectuate.
Utilizarea " del " și să specifice indicele de element pe care doriți să-l ștergeți:
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]
Sprijină, de asemenea, felii:
>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]
Aici este secțiunea din tutorial.
Ca și alții, a menționat pop si del sunt la modalități eficiente de a elimina un element de date index. Totuși, doar de dragul de finalizare (din același lucru poate fi făcut prin mai multe moduri, în Python):
Folosind felii (acest lucru nu se face în loc de ștergere de element din lista inițială):
(De asemenea, acest lucru va fi cea mai puțin eficientă metodă atunci când se lucrează cu Python listă, dar acest lucru ar putea fi utile (dar nu eficient, repet) atunci când se lucrează cu obiecte definite de utilizator care nu suporta pop, dar nu definesc o __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]
Notă: vă Rugăm să rețineți că această metodă nu modifice lista în loc ca " pop " și "del". În schimb face două copii ale listelor (unul de la început până la index, dar fără ea (un[:index]
) și una după indicele de pana la ultimul element (o[index+1:]
)) și creează o nouă listă de obiect prin adăugarea de atât. Aceasta este apoi redistribuit pe lista de variabile ("a"). Vechea listă obiect este, prin urmare, dereferenced și, prin urmare gunoi colectate (cu condiția lista inițială obiect nu este referit de orice alte variabile decât o).
Acest lucru face ca această metodă ineficientă și, de asemenea, poate produce efecte secundare nedorite (mai ales atunci când alte variabile punct la lista inițială obiect care rămâne ne-modificat).
Datorită @MarkDickinson pentru a evidenția acest lucru ...
Acest Stack Overflow răspunsul explică conceptul de feliere.
De asemenea, rețineți că acest lucru funcționează doar cu pozitivi indici.
În timp ce utilizați cu obiecte, __getitem__
metoda trebuie să fi fost definit și, mai important, __add__
metoda trebuie să fi fost definite pentru a returna un obiect care conține elemente din ambele operanzi.
În esență, aceasta funcționează cu orice obiect a cărui definiție clasa este ca:
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 )
Aceasta funcționează cu "lista" care definește __getitem__ " și " __add__
metode.
Comparația dintre cele trei moduri în termeni de eficiență:
Presupune următoarele este predefinite:
a = range(10)
index = 3
La del obiect[index]
metoda:
De departe cea mai eficientă metodă. Funcționează toate obiectele care definesc o __del__
metoda.
Demontarea este după cum urmează:
Cod:
def del_method():
global a
global index
del a[index]
Demontare:
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" metoda:
Este mai puțin eficient decât del metodă și este utilizat atunci când aveți nevoie pentru a obține elementul șters.
Cod:
def pop_method():
global a
global index
a.pop(index)
Demontare:
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
Felie și se adaugă metodă.
Cele mai puțin eficiente.
Cod:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
Demontare:
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
Notă: În toate cele trei dezasamblează ignora ultimele două linii care, practic, se întoarce Nici unul`. De asemenea, primele două linii de încărcare valorile globale " a " și "index".
Acest lucru depinde de ceea ce vrei să faci.
Dacă doriți pentru a reveni la elementul eliminat, folosiți pop()`:
>>> l = [1, 2, 3, 4, 5]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5]
Cu toate acestea, dacă doriți doar pentru a șterge un element, utilizați "del":
>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]
În plus, " del " vă permite să utilizați felii (de exemplu, del a[2:]
).
Dacă doriți să eliminați anumită poziție element într-o listă, cum ar fi a 2-a, 3-a și a 7-a. puteți't folosi
del my_list[2]
del my_list[3]
del my_list[7]
Deoarece după ce ștergeți-al doilea element, cel de-al treilea element pe care îl șterge de fapt este cel de-al patrulea element din lista inițială. Puteți filtra 2, 3 și 7-lea element din lista inițială și a obține o nouă listă, ca mai jos:
new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]
Un alt mod de a elimina un element(e) dintr-o listă de index.
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] puncte pentru elementele de indice x " la " y-1
. Atunci când declarăm că parte din lista ca o listă goală ([]
), aceste elemente sunt eliminate.
Ai putea de căutare pentru elementul pe care doriți să o ștergeți. Este foarte simplu. Exemplu:
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)
Ieșire: a c d e
Utilizați următorul cod pentru a elimina elementul din listă:
list = [1, 2, 3, 4]
list.remove(1)
print(list)
output = [2, 3, 4]
Dacă doriți să eliminați index element de date din lista de utilizare:
list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]
Nu't de sunet ca tine're de lucru cu o listă de liste, așa că am'll scurt. Doriți să utilizați pop, deoarece va elimina elementele care nu sunt elemente care sunt liste, ar trebui să utilizați del pentru asta. Pentru a apela ultimul element în python it's "-1"
>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']
l - lista de valori; trebuie să scoateți indici de 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]
Așa cum am menționat anterior, cele mai bune practici este del(); pop (), dacă aveți nevoie să știu valoarea.
O soluție alternativă este de a re-stack numai acele elemente ce vrei:
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: hmm... nu va funcționa pe negativ valorile indicelui, va medita și de a actualiza
Presupun
if index_<0:index_=len(list_)+index_
ar patch... dar dintr-o dată această idee pare foarte fragil. Interesant experiment de gândire, deși. Se pare că acolo ar trebui să fie un 'adecvat' mod de a face acest lucru cu append() / lista de înțelegere.
reflecție
Utilizați "del" funcția:
del listName[-N]
De exemplu, dacă doriți să eliminați ultimele 3 articole, codul ar trebui să fie:
del listName[-3:]
De exemplu, dacă doriți să eliminați ultimele 8 articole, codul ar trebui să fie:
del listName[-8:]
Sau dacă mai multe indicii ar trebui să fie eliminate:
print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])
Desigur, atunci ar putea face, de asemenea,:
print([v for i,v in enumerate(your_list) if i != unwanted_index])
S-a menționat deja cum de a elimina un singur element dintr-o listă și care sunt avantajele diferite metode. Rețineți, totuși, că eliminarea mai multe elemente are un potențial de erori:
>>> 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]
Elementele 3 și 8 (nu 3 și 7) din lista inițială au fost eliminate (ca lista s-a scurtat timpul de buclă), care nu ar fi fost intenția. Dacă doriți să eliminați în condiții de siguranță mai multe indici tu ar trebui să ștergeți elementele cu cel mai mare indice în primul rând, de exemplu, ca aceasta:
>>> 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]
Se poate folosi fie del sau pop, dar eu prefer del, deoarece puteți specifica index și felii, oferind utilizatorului mai mult control asupra datelor.
De exemplu, începând cu lista afișată, se poate elimina ultimul element cu " del "ca o felie, apoi se poate elimina ultimul element din rezultatul folosind "pop".
>>> l = [1,2,3,4,5]
>>> del l[-1:]
>>> l
[1, 2, 3, 4]
>>> l.pop(-1)
4
>>> l
[1, 2, 3]
Puteți folosi fie del sau pop pentru a elimina elementul din listă bazată pe index. Pop va imprima membru este de a scoate din listă, în timp ce lista a șterge membru, fără de imprimare-l.
>>> a=[1,2,3,4,5]
>>> del a[1]
>>> a
[1, 3, 4, 5]
>>> a.pop(1)
3
>>> a
[1, 4, 5]
>>>
Puteți folosi pur și simplu elimina
funcție de Python. Astfel:
v = [1, 2, 3, 4, 5, 6]
v.remove(v[4]) # I'm removing the number with index 4 of my array
print(v) # If you want verify the process
# It gave me this:
#[1,2,3,4,6]