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] == '[email protected]':
         emails.pop(index)
         otherarray.pop(index)
lokomotif
sumber
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
5
Perhatikan ini: Jangan Mengubah Daftar Selama Iterasi
Yakub

Jawaban:

205

Anda tidak perlu mengulang array. Hanya:

>>> x = ['[email protected]', '[email protected]']
>>> x
['[email protected]', '[email protected]']
>>> x.remove('[email protected]')
>>> x
['[email protected]']

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]
Bogdan
sumber
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 != '[email protected]', emails))

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

Ron Kalian
sumber
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.

MatthieuW
sumber
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 == '[email protected]')

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.

pemukul pil
sumber
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] == '[email protected]' .

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

emails = ['[email protected]', '[email protected]', '[email protected]']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= '[email protected]']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['[email protected]', '[email protected]']
print(otherarray)  # ['some', 'details']
jpp
sumber
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']
SHIVAM KUMAR
sumber