Ro'yxatlar (list)
Sinfda 30 ta o'quvchi bo'lsa, ularning baholarini 30 ta alohida o'zgaruvchida saqlaysizmi? baho1, baho2, ..., baho30? Albatta yo'q. Buning uchun Python'da ro'yxatlar bor — eng ko'p ishlatiladigan ma'lumot tuzilmasi.
Bu darsda
- Ro'yxat yaratish va uning elementlariga murojaat qilish
- Elementlarni o'zgartirish, qo'shish va o'chirish
- Ro'yxat bo'ylab
forsikli sum(),min(),max(),len()va saralashenumerate()va ro'yxatni nusxalashdagi tuzoq
Ro'yxat yaratish
Ro'yxat (inglizcha list) — qiymatlarning tartiblangan to'plami. U kvadrat qavslar [ ] ichida yoziladi, elementlar vergul bilan ajratiladi:
mevalar = ["olma", "anor", "uzum", "behi"] baholar = [5, 4, 5, 3, 4] aralash = ["Ali", 17, True, 1.75] bosh = [] print(mevalar) print(baholar) print(len(mevalar))
['olma', 'anor', 'uzum', 'behi'] [5, 4, 5, 3, 4] 4
Ro'yxatda istalgan turdagi qiymatlar bo'lishi mumkin, hatto aralash holda ham. Lekin amalda odatda bir xil turdagi narsalar saqlanadi: ismlar ro'yxati, narxlar ro'yxati va hokazo.
Ro'yxat — poyezdga o'xshaydi. Har bir vagon — element, vagonlarning tartib raqami bor (0 dan boshlab), poyezdga yangi vagon ulash yoki birini olib tashlash mumkin.
Indekslar
Ro'yxat elementlariga xuddi satrdagi belgilarga murojaat qilgandek, indeks orqali murojaat qilinadi. Indekslar yana 0 dan boshlanadi:
mevalar = ["olma", "anor", "uzum", "behi"] print(mevalar[0]) print(mevalar[2]) print(mevalar[-1]) print(mevalar[1:3])
olma uzum behi ['anor', 'uzum']
Kesmalar ham satrlardagidek ishlaydi va yangi ro'yxat qaytaradi.
Elementni o'zgartirish
Satrdan farqli o'laroq, ro'yxatni o'zgartirish mumkin. Indeks orqali elementga yangi qiymat beriladi:
mevalar = ["olma", "anor", "uzum"] mevalar[0] = "nok" print(mevalar)
['nok', 'anor', 'uzum']
Qo'shish va o'chirish
| Metod | Nima qiladi |
|---|---|
append(x) | Oxiriga x ni qo'shadi |
insert(i, x) | i-o'ringa x ni qo'yadi |
remove(x) | Birinchi uchragan x ni o'chiradi |
pop() | Oxirgi elementni olib tashlaydi va qaytaradi |
pop(i) | i-elementni olib tashlaydi va qaytaradi |
clear() | Ro'yxatni butunlay bo'shatadi |
navbat = ["Aziz", "Bekzod"]
navbat.append("Dilnoza") # oxiriga qo'shildi
print(navbat)
navbat.insert(0, "Kamola") # boshiga qo'shildi
print(navbat)
navbat.remove("Bekzod") # nomi bo'yicha o'chirildi
print(navbat)
birinchi = navbat.pop(0) # birinchisi navbatdan chiqdi
print(birinchi, "xizmat ko'rsatildi")
print(navbat)
['Aziz', 'Bekzod', 'Dilnoza'] ['Kamola', 'Aziz', 'Bekzod', 'Dilnoza'] ['Kamola', 'Aziz', 'Dilnoza'] Kamola xizmat ko'rsatildi ['Aziz', 'Dilnoza']
Ro'yxatda yo'q elementni remove() qilsangiz, ValueError chiqadi. Shuning uchun avval in bilan tekshirish foydali:
mevalar = ["olma", "anor", "uzum"]
if "banan" in mevalar:
mevalar.remove("banan")
else:
print("Ro'yxatda banan yo'q")
Ro'yxat bo'ylab sikl
for sikli ro'yxat bilan juda tabiiy ishlaydi — har bir element uchun bir marta:
shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"]
for shahar in shaharlar:
print(f"{shahar} — {len(shahar)} ta harf")
enumerate() — tartib raqami bilan
Element bilan birga uning tartib raqami ham kerak bo'lsa, enumerate() ishlatiladi. Ikkinchi argument raqamlash nechadan boshlanishini bildiradi:
vazifalar = ["Non olish", "Dars qilish", "Sport bilan shug'ullanish"]
for raqam, vazifa in enumerate(vazifalar, 1):
print(f"{raqam}. {vazifa}")
1. Non olish 2. Dars qilish 3. Sport bilan shug'ullanish
Sonli ro'yxatlar bilan ishlash
Sonlardan iborat ro'yxatlar uchun tayyor funksiyalar bor:
baholar = [5, 4, 5, 3, 4, 5]
print("Soni:", len(baholar))
print("Yig'indisi:", sum(baholar))
print("Eng yuqori:", max(baholar))
print("Eng past:", min(baholar))
print("O'rtacha:", round(sum(baholar) / len(baholar), 2))
print("Nechta besh:", baholar.count(5))
Soni: 6 Yig'indisi: 26 Eng yuqori: 5 Eng past: 3 O'rtacha: 4.33 Nechta besh: 3
Saralash
Ro'yxatni tartiblashning ikki usuli bor:
royxat.sort()— ro'yxatning o'zini saralaydi.sorted(royxat)— asl ro'yxatga tegmasdan, yangi saralangan ro'yxat qaytaradi.
sonlar = [42, 7, 19, 3, 25] print(sorted(sonlar)) print(sonlar) # asl ro'yxat o'zgarmadi sonlar.sort(reverse=True) print(sonlar) # endi o'zi kamayish tartibida ismlar = ["Zafar", "Anvar", "Malika"] ismlar.sort() print(ismlar)
[3, 7, 19, 25, 42] [42, 7, 19, 3, 25] [42, 25, 19, 7, 3] ['Anvar', 'Malika', 'Zafar']
reverse() metodi esa ro'yxatni saralamasdan, shunchaki teskari tartibga o'giradi.
Ro'yxatni to'ldirish
Ko'pincha ro'yxat bo'sh holda yaratiladi va sikl ichida to'ldiriladi:
xaridlar = []
while True:
narsa = input("Nima olish kerak? (tugatish uchun bo'sh qoldiring): ")
if narsa == "":
break
xaridlar.append(narsa)
print(f"\nXaridlar ro'yxati ({len(xaridlar)} ta):")
for i, narsa in enumerate(xaridlar, 1):
print(f"{i}. {narsa}")
Satrdan ro'yxatga va aksincha
9-darsdagi split() satrdan ro'yxat yasaydi, join() esa aksincha. Bu ko'pincha birga ishlatiladi:
gap = "Python o'rganish juda qiziqarli"
sozlar = gap.split()
print(sozlar)
print(len(sozlar), "ta so'z")
print(" ".join(sozlar[::-1]))
Diqqat: ro'yxatni nusxalash
Bu tuzoqqa deyarli hamma bir marta tushadi:
a = [1, 2, 3]
b = a
b.append(4)
print("a:", a)
print("b:", b)
a: [1, 2, 3, 4] b: [1, 2, 3, 4]
Biz faqat b ga qo'shdik, lekin a ham o'zgardi! Sababi: b = a yangi ro'yxat yaratmaydi — u xuddi o'sha ro'yxatga ikkinchi nom beradi. Ikkala yorliq bitta qutiga yopishtirilgan. Haqiqiy nusxa kerak bo'lsa, copy() ishlating:
a = [1, 2, 3]
b = a.copy()
b.append(4)
print("a:", a)
print("b:", b)
Bonus: Python'da ro'yxatni bitta qatorda yaratishning qisqa usuli bor — ro'yxat generatori: [son * 2 for son in sonlar]. Bu «sonlar dagi har bir son uchun son * 2» degani. Hozircha uni yodlash shart emas, lekin boshqa odamlarning kodida ko'p uchratasiz.
sonlar = [1, 2, 3, 4, 5] kvadratlar = [son ** 2 for son in sonlar] print(kvadratlar)
Mashqlar
1-mashq Baholar tahlili
Ro'yxatda nechta «5» borligini va o'rtacha bahoni (2 xona aniqlikda) chiqaring.
A'lo baholar: 3 O'rtacha: 4.33
baholar = [5, 4, 3, 5, 5, 4]
Yechimni ko'rish
baholar = [5, 4, 3, 5, 5, 4]
print("A'lo baholar:", baholar.count(5))
print("O'rtacha:", round(sum(baholar) / len(baholar), 2))
2-mashq Eng issiq kun
max() funksiyasidan foydalanmasdan, sikl yordamida haftaning eng yuqori haroratini toping.
haroratlar = [23, 31, 28, 35, 19, 30, 27]
Ishora
Avval birinchi elementni eng katta deb oling: eng_katta = haroratlar[0]. Keyin har bir element bilan solishtirib, kattarog'i chiqsa — yangilang.
Yechimni ko'rish
haroratlar = [23, 31, 28, 35, 19, 30, 27]
eng_katta = haroratlar[0]
for t in haroratlar:
if t > eng_katta:
eng_katta = t
print(eng_katta)
3-mashq Juft sonlarni ajrating
Berilgan ro'yxatdan faqat juft sonlardan iborat yangi ro'yxat yasang va uni chiqaring.
sonlar = [12, 7, 3, 18, 21, 40, 5] juftlar = []
Yechimni ko'rish
sonlar = [12, 7, 3, 18, 21, 40, 5]
juftlar = []
for son in sonlar:
if son % 2 == 0:
juftlar.append(son)
print(juftlar)
4-mashq Uzun so'zlar
Gapdagi 6 tadan ko'p harfli so'zlarni har birini alohida qatorda chiqaring.
gap = "Dasturlash mantiqiy fikrlashni yaxshi rivojlantiradi"
Yechimni ko'rish
gap = "Dasturlash mantiqiy fikrlashni yaxshi rivojlantiradi"
for soz in gap.split():
if len(soz) > 6:
print(soz)
«yaxshi» so'zida roppa-rosa 6 ta harf bor, shuning uchun u chiqmaydi: «6 tadan ko'p» — bu > 6, >= 6 emas.
O'zingizni sinang
x = [10, 20, 30, 40] bo'lsa, x[-1] nimaga teng?
103040- Xato beradi
To'g'ri. -1 — oxirgi element.
Ro'yxat oxiriga element qo'shish uchun qaysi metod ishlatiladi?
append()add()push()insert()
To'g'ri. insert() esa istalgan o'ringa qo'yadi.
sorted(sonlar) va sonlar.sort() ning farqi nimada?
- Hech qanday farqi yo'q
sorted()yangi ro'yxat qaytaradi,sort()esa ro'yxatning o'zini o'zgartiradisort()faqat sonlarni saralaydisorted()kamayish tartibida saralaydi
To'g'ri. Asl ro'yxat kerak bo'lsa — sorted() ishlating.
Quyidagi kod nima chiqaradi?
a = [1, 2] b = a b.append(3) print(len(a))
21- Xato beradi
3
To'g'ri. a va b — bitta ro'yxatning ikki nomi. Nusxa uchun a.copy() kerak edi.
Xulosa
- Ro'yxat —
[ ]ichidagi tartiblangan qiymatlar to'plami. Indekslar 0 dan boshlanadi. - Ro'yxatni o'zgartirish mumkin:
royxat[0] = yangi. append,insert— qo'shadi;remove,pop— o'chiradi.len,sum,min,max,count— tayyor hisob-kitoblar;sort()vasorted()— saralash.for element in royxat:— ro'yxat bo'ylab yurish;enumerate()— raqami bilan.b = anusxa yaratmaydi —a.copy()ishlating.