Cara menghapus elemen tertentu dari array menggunakan python


142

Saya ingin menulis sesuatu yang menghapus elemen tertentu dari array. Saya tahu bahwa saya harus formengulang melalui array untuk menemukan elemen yang cocok dengan konten.

Katakanlah saya memiliki sebuah array email dan saya ingin menyingkirkan elemen yang cocok dengan beberapa string email.

Saya sebenarnya ingin menggunakan struktur loop for karena saya perlu menggunakan indeks yang sama untuk array lain juga.

Berikut kode yang saya miliki:

for index, item in emails:
    if emails[index] == 'something@something.com':
         emails.pop(index)
         otherarray.pop(index)

7
Apakah kamu sedang mencari list.remove(x)?
Yakub

tidak terlalu. saya ingin menggunakan perulangan for sehingga saya dapat menggunakan kembali indeks
locoboy

4
Anda tidak boleh mengubah daftar saat mengulanginya.
Yakub

mengapa saya tidak melakukan ini? juga tidak berhasil untuk saya.
locoboy

Jawaban:


205

Anda tidak perlu mengulang array. Hanya:

>>> x = ['ala@ala.com', 'bala@bala.com']
>>> x
['ala@ala.com', 'bala@bala.com']
>>> x.remove('ala@ala.com')
>>> x
['bala@bala.com']

Ini akan menghapus kemunculan pertama yang cocok dengan string.

EDIT: Setelah Anda mengedit, Anda masih tidak perlu mengulang. Lakukan saja:

index = initial_list.index(item1)
del initial_list[index]
del other_list[index]

1
lihat di atas saya ingin menggunakan for loop untuk menggunakan kembali indeks yang sama
locoboy

Mengedit jawaban saya. Masih tidak perlu loop.
Bogdan

1
Bagaimana Anda pertama kali memeriksa bahwa item tersebut ada di initial_list? Mungkin ada kasus di mana itu tidak ada dan Anda tidak perlu menghapusnya.
locoboy

18

Menggunakan filter()dan lambdaakan memberikan metode yang rapi dan singkat untuk menghilangkan nilai yang tidak diinginkan:

newEmails = list(filter(lambda x : x != 'something@something.com', emails))

Ini tidak mengubah email. Ini membuat daftar newEmails baru yang hanya berisi elemen yang fungsi anonimnya mengembalikan True.


5

Perulangan for Anda salah, jika Anda membutuhkan indeks dalam perulangan for:

for index, item in enumerate(emails):
    # whatever (but you can't remove element while iterating)

Dalam kasus Anda, solusi Bogdan baik-baik saja, tetapi pilihan struktur data Anda tidak begitu baik. Harus mempertahankan kedua daftar ini dengan data dari satu yang terkait dengan data dari yang lain pada indeks yang sama adalah hal yang janggal.

Daftar tupple (email, data lain) mungkin lebih baik, atau dikt dengan email sebagai kuncinya.


4

Cara yang masuk akal untuk melakukan ini adalah dengan menggunakan zip()dan Pemahaman Daftar / Ekspresi Generator:

filtered = (
    (email, other) 
        for email, other in zip(emails, other_list) 
            if email == 'something@something.com')

new_emails, new_other_list = zip(*filtered)

Juga, jika Anda tidak menggunakan array.array()atau numpy.array(), kemungkinan besar Anda menggunakan []atau list(), yang memberi Anda Daftar, bukan Array. Bukan hal yang sama.


1
Tidak ada yang yakin bagaimana ini "waras" dibandingkan dengan jawaban @ Bogdan, yang jauh lebih bersih.
Jordan Lapp

Terima kasih telah menunjukkan bahwa array tidak sama dengan daftar. Jawaban yang dipilih tidak berfungsi pada array di 2.7.
EL_DON

2

Ada solusi alternatif untuk masalah ini yang juga berhubungan dengan kecocokan duplikat.

Kami mulai dengan 2 daftar dengan panjang yang sama: emails, otherarray. Tujuannya adalah untuk menghapus item dari kedua daftar untuk setiap indeks di imanaemails[i] == 'something@something.com' .

Ini dapat dicapai dengan menggunakan pemahaman daftar dan kemudian membagi melalui zip:

emails = ['abc@def.com', 'something@something.com', 'ghi@jkl.com']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= 'something@something.com']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['abc@def.com', 'ghi@jkl.com']
print(otherarray)  # ['some', 'details']

0

Jika Anda ingin menghapus indeks array:

Gunakan array_name.pop (index_no.)

ex:-

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

Jika Anda ingin menghapus string / elemen tertentu dari array maka

>>> arr1 = ['python3.6' , 'python2' ,'python3']
>>> arr1.remove('python2')
>>> arr1
['python3.6','python3']
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.