Barcha qo'llanmalar

Python'da list'dan element o'chirish: to'liq qo'llanma + misollar

Python'dagi list'dan element o'chirish method'larini yonma-yon taqqoslang. Qaysi biri eng tez ekanini, dublikatlarni qanday olib tashlashni va har birini qachon ishlatishni bilib oling.

Muallif: Kimberly Fessel

Har doim shunchaki qutulib qolishni juda istaydigan o'sha bitta narsa bo'lishini bilasizmi? Hamyoningizdagi muddati o'tgan kupon, sevimli playlist'ingizdagi takroriy qo'shiq, manzillar kitobingizdagi xato yozilgan o'sha bitta ism. Sizga butun qutini tashlab yubormasdan, aynan buzilgan tuxumni olib tashlashning tez va oson usuli kerak.

Python list'lari ham bundan mustasno emas. Siz ko'pincha voz kechishni afzal ko'radigan bitta — yoki bir nechta! — list elementiga duch kelasiz. Ushbu maqolada Python list'idan elementlarni o'chirishning bir nechta usulini tushuntirib beramiz. Usullarni taqqoslaymiz va list'laringizdan elementlarni ajratib tashlashdagi computational complexity haqida qisqacha to'xtalamiz. Elementning qiymatini, uning o'rnini yoki shunchaki u qanoatlantiradigan shartni bilasizmi — uni olib tashlashning Pythonic usuli bor.

Nega Python'da list'dan element o'chiriladi

List'lar — mutable Python collection'lari. Bu ularni yaratganingizdan keyin list'larga element qo'shishingiz yoki ulardan element o'chirishingiz mumkinligini anglatadi. Siz takroriy, eskirgan yoki shunchaki keraksiz elementlarga duch kelishingiz mumkin va baxtga, Python dasturingizning istalgan nuqtasida list elementlarini o'chira olasiz. Bir nechta real hayotiy misol sifatida onlayn xarid savatidan mahsulotlarni olib tashlayotgan foydalanuvchini, vazifalar ro'yxatidagi bandlarni bajarilgan deb belgilayotgan xodimni yoki ehtimoliy saylovchilarni yoshiga qarab filtrlayotgan so'rovchini tasavvur qiling.

List'dan elementlarni o'chirish vaqti kelganda, tanlash uchun bir nechta turli usullaringiz bor. Tanlovingiz ko'pincha element haqida nimani bilishingiz va nechta elementni o'chirishingiz kerakligiga bog'liq bo'ladi. Elementlarni qiymati, index'i yoki xususiyatlari (masalan, age >= 18) asosida olib tashlashingiz mumkin. Bundan tashqari, bir vaqtda bitta elementdan yoki birdaniga ko'plab elementlardan qutulishingiz mumkin. Faqat vazifaga mos o'chirish method'ini tanlaganingizga ishonch hosil qiling.

List method'lari va statement'lariga umumiy nazar

Ko'plab tushunchalar singari, Python'da list'dan element o'chirishning bir nechta usuli bor. Qiymat bo'yicha o'chirishdan tortib list'ning butun tarkibini tozalab tashlashgacha — har bir variantni batafsil ko'rib chiqamiz, shunda qo'llanish holatingiz uchun to'g'risini tanlay olasiz.

.remove(): elementni qiymati bo'yicha o'chirish

.remove() method'ining sintaksisi quyidagicha ko'rinadi: list.remove(value), bunda list — ustida amal bajariladigan list, value esa o'chirmoqchi bo'lgan elementingiz qiymati. Bu method list'ingizni boshidan qidiradi va value'ning faqat birinchi uchrashini olib tashlaydi. O'zgarish in-place sodir bo'ladi, ya'ni method yangi list yaratish o'rniga list'ni bevosita o'zgartiradi. Bundan tashqari, uning qaytaradigan qiymati list'ning yangilangan nusxasi emas, balki None.

Bu misol .remove()'dan foydalanishni ko'rsatadi. Method "cat"ning faqat birinchi mos kelgan nusxasini o'chiradi. Boshqa nusxalari list'da qolganiga e'tibor bering:

pets = ["dog", "lizard", "cat", "dog", "cat", "hamster", "cat"]

pets.remove("cat")

print(pets)

# Expected result:
# ['dog', 'lizard', 'dog', 'cat', 'hamster', 'cat']

Agar Python siz qidirayotgan qiymatning birorta nusxasini topa olmasa, ValueError ko'taradi, shuning uchun list ko'rsatilgan qiymatni o'z ichiga olmasligi mumkin deb kutsangiz, bu exception'ni oldindan hisobga oling yoki in operatori bilan ixtiyoriy membership tekshiruvini qo'shing.

.pop(): elementni index bo'yicha o'chirish

Agar o'chirmoqchi bo'lgan elementingizning qiymatini emas, index'ini bilsangiz, .pop()'ga o'ting. .pop() sintaksisi quyidagicha: list.pop(index). .pop() method'i ayni paytda aynan shu index'da turgan elementni olib tashlaydi. Faqat Python zero-based indexing'dan foydalanishini yodda tuting; birinchi element 0-o'rinda turadi.

Quyida 3-o'rindagi elementni o'chiradigan kod keltirilgan. .remove() method'i kabi .pop() ham list'ni in-place o'zgartiradi, lekin .remove()'dan farqli o'laroq, u o'chirilgan qiymatni qaytaradi:

lucky_numbers = [3, 13, 23, 33, 64, 152]

removed_number = lucky_numbers.pop(3)

print(removed_number)
print(lucky_numbers)

# Expected result:
# 33
# [3, 13, 23, 64, 152]

E'tibor bering, index — ixtiyoriy argument. Usiz .pop() list'ingizdagi oxirgi elementni o'chiradi va qaytaradi. .pop() method'i manfiy index raqamlarini ham qabul qiladi va bunda list'ingiz oxiridan sanaydi. Masalan, list.pop(-2) sizga oxiridan ikkinchi elementni beradi. Agar tasodifan chegaradan tashqaridagi, noto'g'ri index uzatsangiz, Python IndexError ko'taradi.

del statement: del keyword'i yordamida index oralig'i bo'yicha o'chirish

del keyword'i Python statement'ini boshlaydi; bu statement berilgan o'rindagi bitta list elementini (del list[index]) yoki berilgan index oralig'iga tushadigan elementlarni (del list[start:stop]) o'chira oladi. Boshqa list slicing usullari singari, del boshlang'ich index'ni o'z ichiga oladi, ammo tugash index'ini qamrab olmaydi. U list'ingizning slice'larini ham in-place o'chiradi, lekin o'chirilgan elementlarni qaytarmaydi.

Quyidagi kodda Python 2 dan 4 gacha index'li elementlarni o'chiradi, ammo 5-index'dagi "Fran"ni saqlab qoladi:

students = ["Alan", "Betta", "Carol", "Dev", "Eddie", "Fran"]

del students[2:5]

print(students)

# Expected result:
# ['Alan', 'Betta', 'Fran']

E'tibor bering, del statement'i bilan slicing qilishda noto'g'ri index o'rinlarini uzatish IndexError ko'tarmaydi. Python slice chegaralarini list'ning to'g'ri oralig'iga moslab o'zgartiradi.

Python'dagi boshqa list slicing'lar kabi, list boshidan yoki oxirigacha elementlarni o'chirish uchun mos ravishda boshlang'ich va/yoki tugash index'larini tushirib qoldirishingiz mumkin. List oxiridan sanash uchun manfiy index'larni ishlatishingiz, hatto har bir necha elementdan birini o'chirish uchun slice'laringizga step qiymatlarini ham qo'shishingiz mumkin:

students = ["Alan", "Betta", "Carol", "Dev", "Eddie", "Fran"]

del students[::2] # Remove every other student

print(students)

# Expected result:
# ['Betta', 'Dev', 'Fran']

Butun list obyektini o'chirish uchun del statement'ini list'ning o'ziga ham qo'llashingiz mumkin.

.clear(): butun list'ni tozalash

Agar "yadroviy" variantga tayyor bo'lsangiz, list'ning butun tarkibini tozalab tashlashingiz mumkin: list.clear(). .clear()'ni qo'llashda juda ehtiyot bo'ling. Bu method list'ingizning barcha elementlarini in-place o'chiradi va ortidan bo'sh list qoldiradi.

Mana u amalda:

costs = [19.99, 218.89, 8.99, 11.99]

costs.clear()

print(costs)

# Expected result:
# []

.clear() None qaytaradi va list'ingizda ikki element bo'ladimi yoki ikki million — bir xil ishlaydi. List ustida del statement'ini ishlatishdan (masalan, del costs) farqli o'laroq, .clear() qo'llangandan keyin list obyekti saqlanib qoladi. List tarkibini bo'shatish, ammo list obyektining o'zini saqlab qolish kerak bo'lganda, ehtimol, .clear()'ga murojaat qilasiz.

Qiymatning barcha nusxalarini o'chirish

Hozirgacha keltirilgan list'dan o'chirish usullari bitta elementdan, berilgan oraliqdagi elementlardan yoki list'ning butun tarkibidan qutulishga qaratilgan edi. Endi list'dan ko'rsatilgan qiymatning barcha nusxalarini o'chirishga o'tamiz. Bu yerda ham bir nechta turli variantlaringiz bor.

List Comprehensions

Qiymatning barcha nusxalarini o'chirish uchun list comprehension'dan foydalanishni tanlashingiz mumkin. Ushbu qisqa misol butun list bo'ylab "cat"dan qanday qutulishimiz mumkinligini ko'rsatadi:

pets = ["dog", "lizard", "cat", "dog", "cat", "hamster", "cat"]

pets_no_cats = [pet for pet in pets if pet != "cat"]

print(pets_no_cats)

# Expected result:
# ['dog', 'lizard', 'dog', 'hamster']

E'tibor bering, bu usul in-place ishlamaydi. U pets_no_cats list o'zgaruvchisida saqlanadigan butunlay yangi list yaratadi, asl list'ingiz esa o'zgarmasdan qoladi.

Shuningdek, not in va olib tashlanadigan qiymatlar set'idan foydalanib, ikki yoki undan ortiq qiymatning barcha nusxalarini o'chirishingiz mumkin:

pets = ["dog", "lizard", "cat", "dog", "cat", "hamster", "cat"]

pets_filtered = [pet for pet in pets if pet not in ({"cat", "lizard"})]

print(pets_filtered)

# Expected result:
# ['dog', 'dog', 'hamster']

filter()

Kirish funksiyasi truthy natija beradigan barcha elementlarni saqlab qolish uchun filter() funksiyasini tanlashingiz mumkin. Uning sintaksisi: filter(function, iterable), bunda funksiya lambda, built-in yoki o'zingiz aniqlagan funksiya bo'lishi mumkin, iterable esa bizning holatda sizning list'ingiz.

Quyida filter() va lambda funksiya yordamida "cat"ning barcha nusxalarini qanday o'chirish mumkinligi ko'rsatilgan:

pets = ["dog", "lizard", "cat", "dog", "cat", "hamster", "cat"]

pets_no_cats = list(filter(lambda pet: pet != "cat", pets))

print(pets_no_cats)

# Expected result:
# ['dog', 'lizard', 'dog', 'hamster']

filter() funksiyasi iterator qaytaradi, shuning uchun pets_no_cats list o'zgaruvchisi bo'lishini istasangiz, natijani list() ichiga o'rab, uni aylantirishingiz kerak bo'ladi. List comprehension'dagi kabi, asl list'ingiz o'zgarmasdan qoladi.

while Loop

Agar .remove() kabi method'dan foydalanishni afzal ko'rsangiz, har bir nusxadan while loop ichida alohida-alohida qutulishni tanlashingiz mumkin.

Bu kod .remove() method'i "cat"ning barcha nusxalarini o'chirib bo'lguncha ishlashda davom etadi. while loop'ining sharti .remove() faqat "cat" list'da mavjud bo'lgandagina ishlashini ta'minlaydi va shu bilan ValueError'ning oldini oladi:

pets = ["dog", "lizard", "cat", "dog", "cat", "hamster", "cat"]

pet_to_remove = "cat"

while pet_to_remove in pets:
    pets.remove(pet_to_remove)

print(pets)

# Expected result:
# ['dog', 'lizard', 'dog', 'hamster']

while loop'i .remove()'ga tayangani sababli, bu usul asl list'ni in-place o'zgartiradi. Bu method nima qilishi ancha tushunarli bo'lsa-da, bir nechta elementni o'chirish uchun u eng samarali emas, chunki Python har safar shartni tekshirganda va har safar .remove()'ni chaqirganda butun list bo'ylab qidirishiga to'g'ri kelishi mumkin.

Elementlarni shart bo'yicha o'chirish

Barcha nusxalarni o'chirish usullarini muayyan qiymat o'rniga shart asosida list'ni filtrlash uchun kengaytirishingiz mumkin. Shartingiz sonli chegara, string xususiyati yoki obyekt attribute'i bo'lishi mumkin, ammo bu safar ham list comprehension'lar va filter()'ga murojaat qilishingiz mumkin.

Aytaylik, talabalar ballari list'idan o'tish baholarini tanlab olmoqchisiz. Agar kursingizda o'tish bahosi 60 yoki undan yuqori bo'lsa, bu kod list'ingizni filtrlashga yordam beradi:

scores = [75, 44, 60, 98, 58, 83]

passing_scores = [score for score in scores if score >= 60]

print(passing_scores)

# Expected result:
# [75, 60, 98, 83]

Qiymatning barcha nusxalarini o'chirishdagi kabi, list comprehension orqali filtrlangan elementlardan iborat yangi list yaratasiz. Asl list'ingiz o'zgarmasdan qoladi.

Shart asosida bir nechta elementni o'chirish uchun filter() funksiyasidan ham foydalanishingiz mumkin. Bu kod passing_scores'ni yaratish uchun filter()'dan foydalanadi:

scores = [75, 44, 60, 98, 58, 83]

def is_passing(score):
    return score >= 60 

passing_scores = list(filter(is_passing, scores))

print(passing_scores)

# Expected result:
# [75, 60, 98, 83]

filter() lazy evaluation'dan foydalanadi, ya'ni darhol yangi collection yaratish o'rniga elementlarni kerak bo'lganda qayta ishlaydi. Python'da filtrlangan natijani list sifatida ko'rish uchun uning qaytargan qiymatini list() ichiga o'rashni unutmang.

Takroriy list elementlarini o'chirish

Agar maqsadingiz bitta nusxani qoldirib, ortiqchalarini o'chirish bo'lsa, sizga yangi yondashuv kerak bo'ladi. Bu yerda ham bir nechta turli variantlaringiz bor, ammo soddalik uchun tushuntirishimizni set'lar va dictionary key'lariga qaratamiz. Yodda tutingki, ikkala usul ham list elementlarining hashable bo'lishini talab qiladi (masalan, integer'lar, float'lar va string'lar).

List'ingizni set'ga, so'ng yana list'ga aylantirish orqali uning barcha unikal elementlarini avtomatik ravishda olishingiz mumkin. Python'dagi set — faqat unikal elementlarni o'z ichiga oladigan alohida ma'lumotlar tuzilmasi.

Ushbu kod parchasi sonlar list'idan dublikatlarni o'chirish uchun set'dan foydalanadi:

student_ids = [1234, 5678, 1234, 1001, 1001, 1234]

student_ids_unique = list(set(student_ids))

print(student_ids_unique)

# Example result:
# [1001, 1234, 5678]

Bu usulning bitta katta kamchiligi bor: set() list'ingizning asl tartibini saqlab qolishi shart emas. Agar list elementlari joriy tartibida qolishi zarur bo'lsa, buning o'rniga dict.fromkeys()'ni sinab ko'ring:

student_ids = [1234, 5678, 1234, 1001, 1001, 1234]

student_ids_unique = list(dict.fromkeys(student_ids))

print(student_ids_unique)

# Expected result:
# [1234, 5678, 1001]

Agar list elementlaringiz tartibini saqlab qolishingiz kerak bo'lsa, list'ingizni dictionary'ga, so'ng yana list'ga aylantirishni tanlashingiz mumkin. Bu variant avval list'ingizdagi elementlarni key sifatida olgan dictionary quradi. So'ng har bir qiymatning birinchi uchrashini saqlagan holda key'larni qaytadan list'ga o'tkazadi.

Unumdorlik va complexity

Turli Python list usullarining unumdorligi va complexity'sini ko'rib chiqishda list o'sgani sari method qanday masshtablanishini hisobga olishingiz kerak. Complexity'ni tavsiflashning keng tarqalgan usullaridan biri bo'lgan big O notation complexity haqida abstrakt ma'noda ma'lumot beradi. Masalan, O(1) usulning ishlash vaqti list hajmi bilan o'smasligini anglatadi; O(n) method hisob-kitoblari list hajmiga chiziqli ravishda masshtablanishini anglatadi; O(n2) yondashuvlar list o'sgani sari kvadratik ravishda masshtablanadi; va hokazo.

Ushbu maqolada ko'rgan list'dan o'chirish usullaringiz asosan O(n) kabi o'sadi, ya'ni ularning ishi elementlar soniga taxminan proporsional ravishda ortadi. Biroq ikkita e'tiborga molik istisno bor. Index argument'ini bermaganingizda .pop() method'i O(1) bo'ladi; ya'ni oxirgi elementni o'chirishda u O(1), chunki Python hech qanday elementni qidirishi yoki surishi shart emas. Boshidan o'chirish esa teskari holat: qolgan har bir element suriladi va aynan shu yerda linked list yoki collections.deque o'z o'rnini oqlaydi.

Biroq barcha nusxalarni o'chirish yoki shart asosida filtrlash uchun while loop'idan foydalanish O(n2) kabi masshtablanishi mumkin. Har bir iteration chiziqli vaqtli membership yoki shart tekshiruvini, shuningdek chiziqli vaqtli .remove() amalini bajarishi mumkin. Bu samarasizlik tufayli, ko'plab elementlarni o'chirishda, ayniqsa katta list'larda, bunday uslubdagi while loop'laridan odatda qochish kerak.

Python'da method'lar taqqoslanishi: list'dan elementlarni o'chirish

Python'da list'dan elementlarni o'chirishning shuncha turli usullari bor ekan, ularni taqqoslash uchun bitta ixcham jadvalga ega bo'lish foydali. Bilimlaringizni yangilash va qo'llanish holatingiz uchun eng yaxshi usulni tanlash uchun quyidagini ko'rib chiqing:

Method Turi Nimani o'chiradi In-place? Qaytaradi Eng mos qo'llanish holati
.remove(value) Method Birinchi mos qiymat Ha None O'chiriladigan qiymat ma'lum
.pop(index) Method Index bo'yicha bitta element Ha O'chirilgan element O'chiriladigan index ma'lum; o'chirilgan element kerak
del list[start:stop] Statement Elementlar oralig'i Ha – List slice'larini o'chirish
.clear() Method Barcha elementlar Ha – List'ni bo'shatish
List comprehension Expression Bir nechta mos elementlar Yo'q Yangi list Barcha mosliklarni o'chirish yoki shart bo'yicha filtrlash
filter() Funksiya Bir nechta mos elementlar Yo'q filter iterator Lazy filtrlash, ayniqsa mavjud funksiya bilan
while loop + .remove() Loop + method Qiymatning barcha nusxalari Ha – Kichik mavjud list'ni takroran o'zgartirish
list(set(...)) Konvertatsiya Dublikatlar Yo'q Yangi list Tartibni saqlamagan holda unikal qiymatlar
list(dict.fromkeys(...)) Konvertatsiya Dublikatlar Yo'q Yangi list Tartibni saqlagan holda unikal qiymatlar

Xulosa

Python list'ingizni qisqartirish vaqti kelganda, elementlarni o'chirish uchun ko'plab variantlaringiz bor. Bitta elementdan qiymati bo'yicha .remove() yoki index bo'yicha .pop() bilan, elementlar oralig'idan del bilan, list'ning barcha elementlaridan esa .clear() bilan qutulishingiz mumkin. Agar qiymat yoki shart asosida barcha nusxalarni tashlab yuborishingiz kerak bo'lsa, list comprehension yoki filter()'ni sinab ko'ring. Dublikatlarni o'chirishga yordam beradigan set() yoki dict.fromkeys() haqida ham unutmang.

So'nggi ogohlantirish: o'sha list ustida iterate qilayotganda undan elementlarni o'chirmaslikka harakat qiling. Elementlarni o'chirish keyingi elementlarning o'rnini suradi, shuning uchun loop'ingiz tasodifan ba'zi elementlarni o'tkazib yuborishi mumkin. Buning o'rniga list comprehension'lar asl list'ingizni o'zgartirmasdan filtrlangan list qurish imkonini beradi.

Python'da list'dan elementlarni o'chirishni o'zlashtirdim deb o'ylaysizmi? Ushbu prompt'dan boshlab AI Tutor bilan muloqot qilib, o'zingizni sinab ko'ring:

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring