Pertanyaan Bagaimana cara menghapus elemen dari daftar berdasarkan indeks dengan Python?


Bagaimana cara menghapus elemen dari daftar berdasarkan indeks dengan Python?

Saya menemukan itu list.remove metode, tetapi katakan saya ingin menghapus elemen terakhir, bagaimana saya melakukan ini? Sepertinya penghapusan default mencari daftar, tetapi saya tidak ingin pencarian apa pun dilakukan.


1050
2018-03-09 18:16


asal


Jawaban:


Menggunakan del dan tentukan indeks elemen yang ingin Anda hapus:

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

Juga mendukung irisan:

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

Sini adalah bagian dari tutorial.


1211
2018-03-09 18:21



Anda mungkin menginginkannya pop:

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

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

Secara default, pop tanpa argumen apa pun menghapus item terakhir:

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

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

488
2018-03-09 18:17



Seperti yang disebutkan orang lain adalah pop dan del itu cara efisien untuk menghapus item dari indeks yang diberikan. Namun hanya demi penyelesaian (karena hal yang sama dapat dilakukan melalui banyak cara dengan Python):

Menggunakan irisan (ini tidak dilakukan di tempat penghapusan item dari daftar asli):

(Juga ini akan menjadi metode yang paling tidak efisien ketika bekerja dengan daftar Python, tetapi ini bisa berguna (tetapi tidak efisien, saya tegaskan) ketika bekerja dengan objek yang ditentukan pengguna yang tidak mendukung pop, namun jangan mendefinisikan __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]

catatan: Harap dicatat bahwa metode ini tidak mengubah daftar di tempat seperti pop dan del. Ini malah membuat dua salinan daftar (satu dari awal sampai indeks tetapi tanpa itu (a[:index]) dan satu setelah indeks hingga elemen terakhir (a[index+1:])) dan membuat objek daftar baru dengan menambahkan keduanya. Ini kemudian dipindahkan ke variabel daftar (a). Objek daftar lama itu kemudian dereferenced dan karenanya sampah dikumpulkan (asalkan objek daftar asli tidak direferensikan oleh variabel lain selain a).

Ini membuat metode ini sangat tidak efisien dan juga dapat menghasilkan efek samping yang tidak diinginkan (terutama ketika variabel lain menunjuk ke objek daftar asli yang tetap tidak dimodifikasi).

Terima kasih kepada @MarkDickinson untuk menunjukkan ini ...

Ini Jawaban Stack Overflow menjelaskan konsep mengiris.

Juga perhatikan bahwa ini hanya bekerja dengan indeks positif.

Saat menggunakan dengan objek, __getitem__ metode harus didefinisikan dan yang lebih penting __add__ metode harus telah ditetapkan untuk mengembalikan objek yang berisi item dari kedua operan.

Intinya, ini bekerja dengan objek apa pun yang definisi kelasnya seperti:

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 )

Ini bekerja dengan list yang mendefinisikan __getitem__ dan __add__ metode.

Perbandingan ketiga cara dalam hal efisiensi:

Asumsikan yang berikut ini telah ditentukan sebelumnya:

a = range(10)
index = 3

Itu del object[index] metode:

Sejauh ini merupakan metode yang paling efisien. Ia bekerja akan semua objek yang mendefinisikan __del__ metode.

Pembongkarannya adalah sebagai berikut:

Kode:

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

Membongkar:

 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 metode:

Ini kurang efisien daripada metode del dan digunakan ketika Anda perlu mendapatkan item yang dihapus.

Kode:

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

Membongkar:

 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

Potongan dan tambahkan metode.

Paling tidak efisien.

Kode:

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

Membongkar:

 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

Catatan: Dalam semua tiga disassembles, abaikan dua baris terakhir yang pada dasarnya adalah return None. Juga dua baris pertama memuat nilai global a dan index.


96
2018-06-22 15:21



pop juga berguna untuk menghapus dan menyimpan item dari daftar. Dimana delsebenarnya merusak item.

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

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

41
2017-10-19 13:10



Umumnya, saya menggunakan metode berikut:

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

12
2017-10-05 12:23



Ini tergantung pada apa yang ingin Anda lakukan.

Jika Anda ingin mengembalikan elemen yang Anda hapus, gunakan pop():

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

Namun, jika Anda hanya ingin menghapus elemen, gunakan del:

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

Selain itu, del memungkinkan Anda menggunakan irisan (mis. del[2:]).


10
2017-08-11 00:17



Namun cara lain untuk menghapus elemen (s) dari daftar dengan indeks.

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] menunjuk ke elemen dari indeks x untuk y-1. Ketika kami menyatakan bagian daftar itu sebagai daftar kosong ([]), elemen-elemen tersebut dihapus.


6
2017-10-30 09:21



Anda hanya dapat mencari item yang ingin Anda hapus. Ini sangat sederhana. Contoh:

    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)

Output: a c d e


6
2018-02-15 13:09



Gunakan kode berikut untuk menghapus elemen dari daftar:

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

output = [2, 3, 4]

Jika Anda ingin menghapus data elemen indeks dari daftar yang digunakan:

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

5
2018-05-14 13:29