Ro'yxatlar (list)
Bu bobda
- bir nechta qiymatni bitta o'zgaruvchida saqlashni
- elementni olish, o'zgartirish, qo'shish va o'chirishni
sort()vasorted()farqini va harflar tartibi tuzog'ini- ro'yxatdan nusxa olishning to'g'ri yo'lini
split()vajoin()bilan matn ↔ ro'yxat
Nega ro'yxat kerak?
Guruhda 25 ta talaba bo'lsa, 25 ta o'zgaruvchi (talaba1, talaba2, ...) ochmaymiz. Ro'yxat (list) — qiymatlarning tartiblangan to'plami. U kvadrat qavs ichida, vergul bilan yoziladi:
mevalar = ["olma", "anor", "behi", "tarvuz"] print(mevalar) print(type(mevalar)) print(len(mevalar))
['olma', 'anor', 'behi', 'tarvuz'] <class 'list'> 4
Ro'yxatda istalgan turdagi qiymat bo'lishi mumkin, hatto aralash:
baholar = [5, 4, 5, 3] aralash = ["Ali", 20, 1.75, True] bosh = [] print(baholar, aralash, bosh)
[5, 4, 5, 3] ['Ali', 20, 1.75, True] []
list() boshqa narsadan ro'yxat yasaydi:
print(list(range(1, 6))) print(list("salom"))
[1, 2, 3, 4, 5] ['s', 'a', 'l', 'o', 'm']
Indeks: satrdagi kabi
Indekslash va kesish 5-bobdagi satrlar bilan aynan bir xil:
studentlar = ["Abulqosim", "Sarvinoz", "Otabek", "Javohir", "Behruz"] print(studentlar[0]) print(studentlar[-1]) print(studentlar[1:3]) print(studentlar[::-1])
Abulqosim Behruz ['Sarvinoz', 'Otabek'] ['Behruz', 'Javohir', 'Otabek', 'Sarvinoz', 'Abulqosim']
studentlar = ["Abulqosim", "Sarvinoz", "Otabek"] print(studentlar[3])
IndexError: list index out of range
Ro'yxat elementi ham satr bo'lsa, unga satr metodlarini qo'llash mumkin:
studentlar = ["abulqosim", "sarvinoz", "otabek"] print(f"Mening do'stim {studentlar[2].capitalize()}")
Mening do'stim Otabek
Ro'yxat o'zgaradi
Satrdan asosiy farqi: ro'yxat o'zgaruvchan (mutable). Elementni joyida almashtirish mumkin:
mevalar = ["olma", "anor", "behi"] mevalar[0] = "tarvuz" print(mevalar)
['tarvuz', 'anor', 'behi']
Qo'shish
mevalar = ["olma", "anor"] mevalar.append("behi") print(mevalar) mevalar.insert(0, "uzum") print(mevalar) mevalar.extend(["nok", "olcha"]) print(mevalar)
['olma', 'anor', 'behi'] ['uzum', 'olma', 'anor', 'behi'] ['uzum', 'olma', 'anor', 'behi', 'nok', 'olcha']
| Metod | Nima qiladi |
|---|---|
append(x) |
oxiriga bitta element qo'shadi |
insert(i, x) |
i o'ringa qo'shadi, qolganlari suriladi |
extend(ro'yxat) |
boshqa ro'yxatning hamma elementlarini oxiriga qo'shadi |
append ga ro'yxat berish
a = [1, 2] a.append([3, 4]) print(a, len(a)) b = [1, 2] b.extend([3, 4]) print(b, len(b))
[1, 2, [3, 4]] 3 [1, 2, 3, 4] 4
append ro'yxatni bitta element sifatida qo'shdi: ichida ro'yxat paydo bo'ldi. Elementlarini qo'shish uchun extend.
O'chirish
studentlar = ["Abulqosim", "Sarvinoz", "Otabek", "Javohir", "Behruz"] oxirgisi = studentlar.pop() print("pop():", oxirgisi, studentlar) ikkinchisi = studentlar.pop(1) print("pop(1):", ikkinchisi, studentlar) studentlar.remove("Otabek") print("remove:", studentlar) del studentlar[0] print("del:", studentlar)
pop(): Behruz ['Abulqosim', 'Sarvinoz', 'Otabek', 'Javohir'] pop(1): Sarvinoz ['Abulqosim', 'Otabek', 'Javohir'] remove: ['Abulqosim', 'Javohir'] del: ['Javohir']
| Usul | Nimani o'chiradi | Qaytaradimi? |
|---|---|---|
pop() |
oxirgisini | ha, o'chirilgan elementni |
pop(i) |
i indeksdagini |
ha |
remove(x) |
qiymati x bo'lgan birinchi elementni |
yo'q |
del a[i] |
i indeksdagini |
yo'q |
clear() |
hammasini | yo'q |
Yo'q elementni remove qilish
mevalar = ["olma", "anor"] mevalar.remove("banan")
ValueError: list.remove(x): x not in list
Avval tekshiring: if "banan" in mevalar: mevalar.remove("banan").
Bir xil qiymatning hammasini o'chirish uchun while va in:
hayvonlar = ["it", "mushuk", "sichqon", "baliq", "quyon", "mushuk"] while "mushuk" in hayvonlar: hayvonlar.remove("mushuk") print(hayvonlar)
['it', 'sichqon', 'baliq', 'quyon']
Qidirish
baholar = [5, 4, 5, 3, 5, 4] print(5 in baholar) print(baholar.count(5)) print(baholar.index(3))
True 3 3
index(x) — x ning birinchi indeksi. x bo'lmasa, ValueError beradi — avval in bilan tekshiring.
Tartiblash: sort() va sorted()
sonlar = [42, 7, 19, 3, 25] sonlar.sort() print(sonlar) sonlar.sort(reverse=True) print(sonlar)
[3, 7, 19, 25, 42] [42, 25, 19, 7, 3]
sort() ro'yxatning o'zini o'zgartiradi. Asl ro'yxat kerak bo'lsa, sorted() — u yangi ro'yxat qaytaradi:
sonlar = [42, 7, 19, 3, 25] tartiblangan = sorted(sonlar) print("yangi:", tartiblangan) print("asl: ", sonlar)
yangi: [3, 7, 19, 25, 42] asl: [42, 7, 19, 3, 25]
sort() natijasini o'zgaruvchiga olish
sonlar = [3, 1, 2] natija = sonlar.sort() print(natija) print(sonlar)
None [1, 2, 3]
sort() hech narsa qaytarmaydi (None), u ro'yxatni joyida tartiblaydi. Yangi ro'yxat kerak bo'lsa — sorted(sonlar).
Katta harflar oldinda turadi
mashinalar = ["bmw", "mercedes", "toyota", "bugatti", "Spark"] print(sorted(mashinalar)) print(sorted(mashinalar, key=str.lower))
['Spark', 'bmw', 'bugatti', 'mercedes', 'toyota'] ['bmw', 'bugatti', 'mercedes', 'Spark', 'toyota']
Kompyuter uchun hamma katta harflar kichik harflardan oldin keladi ("S" < "b"). Shuning uchun Spark birinchi chiqdi. Harf kattaligiga qaramay tartiblash uchun key=str.lower: tartiblashda har bir so'z kichik harfga o'girib solishtiriladi, lekin natijada asl ko'rinishida qoladi.
reverse() — tartiblamaydi, faqat teskari aylantiradi:
mashinalar = ["bmw", "mercedes", "toyota"] mashinalar.reverse() print(mashinalar)
['toyota', 'mercedes', 'bmw']
for bilan ro'yxat bo'ylab
7-bobdagi for endi o'zining asosiy vazifasida:
mashinalar = ["bmw", "mercedes", "toyota", "bugatti", "spark"] for mashina in mashinalar: print(mashina.capitalize())
Bmw Mercedes Toyota Bugatti Spark
Ro'yxatdan yangi ro'yxat yasash — juda ko'p uchraydigan andoza:
hayvonlar = ["Lion", "Tiger", "Elephant", "Zebra", "Panda"] kichik = [] for h in hayvonlar: kichik.append(h.lower()) print(kichik)
['lion', 'tiger', 'elephant', 'zebra', 'panda']
Filtrlash — faqat shartga mos elementlarni olish:
ballar = [45, 88, 72, 30, 95, 61] otganlar = [] for b in ballar: if b >= 60: otganlar.append(b) print(otganlar) print(f"{len(otganlar)} / {len(ballar)} talaba o'tdi")
[88, 72, 95, 61] 4 / 6 talaba o'tdi
sum, min, max, len ro'yxat bilan ishlaydi:
ballar = [45, 88, 72, 30, 95, 61] print("Yig'indi:", sum(ballar)) print("O'rtacha:", round(sum(ballar) / len(ballar), 1)) print("Eng yuqori:", max(ballar), " eng past:", min(ballar))
Yig'indi: 391 O'rtacha: 65.2 Eng yuqori: 95 eng past: 30
Indeks ham kerak bo'lsa — range(len(...)):
ballar = [45, 88, 72, 30, 95, 61] eng_i = 0 for i in range(len(ballar)): if ballar[i] > ballar[eng_i]: eng_i = i print(f"Eng yuqori ball {ballar[eng_i]}, indeksi {eng_i}")
Eng yuqori ball 95, indeksi 4
10-bobda buni enumerate() bilan chiroyliroq yozamiz.
Nusxa olish tuzog'i
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]
a ni o'zgartirmagan edik, lekin u ham o'zgardi! 1-bobni eslang: o'zgaruvchi — yorliq. b = a yangi ro'yxat yasamaydi, xuddi shu ro'yxatga ikkinchi yorliq yopishtiradi. Haqiqiy nusxa uchun copy() yoki [:]:
a = [1, 2, 3] b = a.copy() b.append(4) print("a:", a) print("b:", b)
a: [1, 2, 3] b: [1, 2, 3, 4]
split() va join(): matn ↔ ro'yxat
split() matnni so'zlarga ajratib, ro'yxat qaytaradi:
gap = "Men Python o'rganyapman" sozlar = gap.split() print(sozlar) print(len(sozlar), "ta so'z") print("12,45,7".split(","))
['Men', 'Python', "o'rganyapman"] 3 ta so'z ['12', '45', '7']
join() — teskarisi: ro'yxatni bitta matnga yopishtiradi. Ajratuvchi oldida yoziladi:
sozlar = ["Toshkent", "Samarqand", "Buxoro"] print(", ".join(sozlar)) print(" -> ".join(sozlar))
Toshkent, Samarqand, Buxoro Toshkent -> Samarqand -> Buxoro
5-bobdagi title() muammosining yechimi
O'zbekcha ismlarda title() apostrofdan keyin ham katta harf qo'yardi. Endi har bir so'zni alohida capitalize() qilamiz:
ism = "o'tkir g'ulomov" print(ism.title()) qismlar = [] for soz in ism.split(): qismlar.append(soz.capitalize()) print(" ".join(qismlar))
O'Tkir G'Ulomov O'tkir G'ulomov
Bir qatordan bir nechta son o'qish
Endi foydalanuvchi sonlarni bitta qatorda, probel bilan kirita oladi:
qator = input("Sonlarni probel bilan kiriting: ") sonlar = [] for s in qator.split(): sonlar.append(int(s)) print(sonlar) print("Yig'indi:", sum(sonlar))
Sonlarni probel bilan kiriting: 5 12 7 20 3 [5, 12, 7, 20, 3] Yig'indi: 47
split() matnlar ro'yxatini beradi (['5', '12', ...]), shuning uchun har birini int() qilamiz. 12-bobda buni bitta qatorda yozishni o'rganamiz.
Ro'yxat ichida ro'yxat
Jadvalni ro'yxatlar ro'yxati bilan ifodalash mumkin:
jurnal = [ ["Ali", 5, 4, 5], ["Vali", 3, 4, 4], ["Sarvinoz", 5, 5, 5], ] for qator in jurnal: ism = qator[0] baholar = qator[1:] print(f"{ism:<10} o'rtacha {sum(baholar) / len(baholar):.2f}")
Ali o'rtacha 4.67 Vali o'rtacha 3.67 Sarvinoz o'rtacha 5.00
jurnal[2][0] — 2-qatorning 0-elementi, ya'ni "Sarvinoz".
Kitoblarda
- Python asoslari: List (ro'yxat) 30–37-betlar.
- Python Crash Course: 3-bob Introducing Lists 33–47-betlar (
append,insert,del,pop,remove,sort,sorted,reverse,len); 4-bob Working with Lists 49–69-betlar (for,range,min/max/sum, kesish, nusxa olish).
Xulosa
[a, b, c]— ro'yxat; indeks va kesish satrdagidek.append— bitta,extend— ko'p,insert(i, x)— o'rtaga.popqaytaradi,removeqiymat bo'yicha,delindeks bo'yicha o'chiradi.sort()joyida vaNoneqaytaradi;sorted()yangi ro'yxat beradi;key=str.lower— harf kattaligiga qaramay.b = anusxa emas!a.copy()yokia[:].split()matn → ro'yxat,"sep".join()ro'yxat → matn.
Mashqlar
Ro'yxatni bitta qatorda probel bilan kiritiladi deb oling: sonlar = [], keyin for s in input().split(): sonlar.append(int(s)). Natijani probel bilan yoki ro'yxat ko'rinishida chiqarishingiz mumkin.
Butun son N berilgan (N > 0). Dastlabki N ta musbat toq sondan ro'yxat tuzing va chiqaring: 1, 3, 5, ...
| Kirish | Kutilgan natija |
|---|---|
| 5 | 1 3 5 7 9 |
| 1 | 1 |
| 3 | 1 3 5 |
Yechimni ko'rish
n = int(input()) r = [] for i in range(n): r.append(2 * i + 1) print(r)
Butun son N berilgan (N > 0). 2 ning dastlabki N ta darajasidan ro'yxat tuzing: 2, 4, 8, 16, ...
| Kirish | Kutilgan natija |
|---|---|
| 5 | 2 4 8 16 32 |
| 1 | 2 |
| 10 | 2 4 8 16 32 64 128 256 512 1024 |
Yechimni ko'rish
n = int(input()) r = [] for i in range(1, n + 1): r.append(2 ** i) print(r)
N (N > 1), A va D berilgan. Birinchi hadi A, ayirmasi D bo'lgan arifmetik progressiyaning dastlabki N ta hadidan ro'yxat tuzing: A, A + D, A + 2D, ...
| Kirish | Kutilgan natija |
|---|---|
| 5, 1, 3 | 1 4 7 10 13 |
| 3, 10, -5 | 10 5 0 |
| 4, 0, 0 | 0 0 0 0 |
Yechimni ko'rish
n = int(input()) a = int(input()) d = int(input()) r = [] for i in range(n): r.append(a + i * d) print(r)
N (N > 1), A va D berilgan. Birinchi hadi A, maxraji D bo'lgan geometrik progressiyaning dastlabki N ta hadidan ro'yxat tuzing: A, A·D, A·D², ...
| Kirish | Kutilgan natija |
|---|---|
| 5, 1, 2 | 1 2 4 8 16 |
| 4, 3, -1 | 3 -3 3 -3 |
| 3, 5, 10 | 5 50 500 |
Yechimni ko'rish
n = int(input()) a = int(input()) d = int(input()) r = [a] for _ in range(n - 1): r.append(r[-1] * d) print(r)
Sonlar ro'yxati berilgan (bitta qatorda). Elementlarini teskari tartibda chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1 2 3 4 5 | 5 4 3 2 1 |
| 7 | 7 |
| 10 -3 8 | 8 -3 10 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) print(r[::-1])
Butun sonlar ro'yxati berilgan. Undagi barcha toq sonlarni tartibi bo'yicha chiqaring, oxirida esa ularning sonini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1 2 3 4 5 | 1 3 5 3 |
| 2 4 6 | 0 |
| 7 -3 8 9 | 7 -3 9 3 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) toq = [] for x in r: if x % 2 != 0: toq.append(x) print(toq, len(toq))
Butun sonlar ro'yxati berilgan. Undagi barcha juft sonlarni teskari tartibda chiqaring, oxirida esa ularning sonini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1 2 3 4 5 6 | 6 4 2 3 |
| 1 3 5 | 0 |
| 8 -2 7 0 | 0 -2 8 3 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) juft = [] for x in r: if x % 2 == 0: juft.append(x) print(juft[::-1], len(juft))
Ballar ro'yxati berilgan. Eng yuqori ballni va uning indeksini chiqaring (bir nechta bo'lsa — birinchisi).
| Kirish | Kutilgan natija |
|---|---|
| 45 88 72 95 61 | 95 3 |
| 10 10 5 | 10 0 |
| 7 | 7 0 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) print(max(r), r.index(max(r)))
Ballar ro'yxati berilgan. O'rtacha balldan yuqori ball olganlar sonini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 40 60 80 | 1 |
| 50 50 50 | 0 |
| 10 20 30 100 | 1 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) ort = sum(r) / len(r) k = 0 for x in r: if x > ort: k += 1 print(k)
Sonlar ro'yxati berilgan. Takrorlanganlarini olib tashlang, birinchi uchragan tartibini saqlab chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 3 1 3 2 1 5 | 3 1 2 5 |
| 7 7 7 | 7 |
| 1 2 3 | 1 2 3 |
Yechimni ko'rish
r = [] for s in input().split(): if int(s) not in r: r.append(int(s)) print(r)
Ism-familiya (ikki yoki undan ortiq so'z) kichik harflar bilan berilgan. Har bir so'zni katta harf bilan boshlab chiqaring. O'zbekcha apostroflarga e'tibor bering: o'tkir → O'tkir.
| Kirish | Kutilgan natija |
|---|---|
| o'tkir g'ulomov | O'tkir G'ulomov |
| abulqosim rafiqov | Abulqosim Rafiqov |
| ali vali o'g'li | Ali Vali O'g'li |
Yechimni ko'rish
q = [] for soz in input().split(): q.append(soz.capitalize()) print(" ".join(q))
Sonlar ro'yxati berilgan (kamida ikkita har xil son bor). Ikkinchi eng katta har xil sonni chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 5 9 3 9 7 | 7 |
| 1 2 | 1 |
| 4 4 8 4 | 4 |
Yechimni ko'rish
r = [] for s in input().split(): if int(s) not in r: r.append(int(s)) r.sort() print(r[-2])
Shaharlar nomlari bitta qatorda probel bilan berilgan. Ularni alifbo tartibida (harf kattaligiga qaramay) vergul va probel bilan ajratib chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| toshkent Buxoro samarqand Andijon | Andijon, Buxoro, samarqand, toshkent |
| b A c | A, b, c |
Yechimni ko'rish
print(", ".join(sorted(input().split(), key=str.lower)))
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.