Kortej (tuple), enumerate() va zip()
Bu bobda
- o'zgarmas ro'yxat — kortej (tuple) nima va qachon kerakligini
- qiymatlarni "ochish" (unpacking) ni
enumerate()bilan indeks va qiymatni birga olishnizip()bilan ikki ro'yxatni juftlab yurishni
Kortej: o'zgarmas ro'yxat
Kortej (tuple) ro'yxatga juda o'xshaydi, lekin oddiy qavs bilan yoziladi va uni o'zgartirib bo'lmaydi:
nuqta = (41.31, 69.28) ranglar = ("qizil", "sariq", "yashil") print(nuqta[0], ranglar[-1]) print(len(ranglar)) print(type(ranglar))
41.31 yashil 3 <class 'tuple'>
Indeks, kesish, in, len, for — hammasi ro'yxatdagidek ishlaydi. Faqat o'zgartirish taqiqlangan:
ranglar = ("qizil", "sariq", "yashil") ranglar[0] = "ko'k"
TypeError: 'tuple' object does not support item assignment
append, remove, sort kabi metodlar ham yo'q. Faqat ikkitasi bor: count() va index().
Nega o'zgarmas narsa kerak?
- Xavfsizlik. Hafta kunlari, koordinatalar, sozlamalar — tasodifan o'zgarib qolmasligi kerak bo'lgan ma'lumot.
- Ma'no. Kortej "bu qiymatlar birga bitta narsani bildiradi" degan signal:
(kenglik, uzunlik),(ism, yosh). - Lug'at kaliti bo'la oladi (11-bob), ro'yxat esa bo'la olmaydi.
HAFTA = ("dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba", "yakshanba") print(HAFTA[4]) print("shanba" in HAFTA) print(HAFTA.index("yakshanba") + 1, "- kun")
juma True 7 - kun
Baribir o'zgartirish kerak bo'lsa: ro'yxatga o'girib, o'zgartirib, qaytadan kortejga o'giramiz:
a = ("daftar", "qalay", "ot") r = list(a) r[1] = "qalam" a = tuple(r) print(a)
('daftar', 'qalam', 'ot')Bitta elementli kortej
a = (5) b = (5,) print(type(a), type(b))
<class 'int'> <class 'tuple'>
(5) — bu shunchaki qavs ichidagi son. Bitta elementli kortej uchun vergul shart: (5,). Aslida kortejni qavs emas, vergul yasaydi: t = 1, 2, 3 ham kortej.
Ochish (unpacking)
1-bobda a, b = b, a yozgan edik. Endi bilamizki, o'ng tomonda kortej yasaladi, keyin u chapdagi nomlarga ochiladi:
nuqta = (3, 4) x, y = nuqta print(f"x = {x}, y = {y}") ism, yosh, shahar = ("Sarvinoz", 19, "Buxoro") print(f"{ism}, {yosh} yosh, {shahar}")
x = 3, y = 4 Sarvinoz, 19 yosh, Buxoro
Chapdagi nomlar soni elementlar soniga teng bo'lishi kerak. Ortiqchasini * yig'ib oladi:
birinchi, *qolgani = [5, 4, 3, 2, 1] print(birinchi) print(qolgani)
5 [4, 3, 2, 1]
enumerate(): indeks va qiymat birga
9-bobda indeks kerak bo'lganda range(len(...)) yozdik. enumerate() har bir aylanishda (indeks, qiymat) juftini beradi:
mevalar = ["olma", "anor", "behi"] for i, meva in enumerate(mevalar): print(i, meva)
0 olma 1 anor 2 behi
start=1 — odamlar uchun 1 dan sanash:
navbat = ["Ali", "Vali", "Sarvinoz"] for raqam, ism in enumerate(navbat, start=1): print(f"{raqam}. {ism}")
1. Ali 2. Vali 3. Sarvinoz
9-bobdagi "eng yuqori ball qaysi o'rinda" masalasi endi tushunarliroq:
ballar = [45, 88, 72, 30, 95, 61] eng_i, eng = 0, ballar[0] for i, b in enumerate(ballar): if b > eng: eng_i, eng = i, b print(f"{eng_i + 1}-talaba: {eng} ball")
5-talaba: 95 ball
zip(): ikki ro'yxatni juftlash
zip() bir nechta ro'yxatni yonma-yon yurib, har qadamda bittadan element beradi:
ismlar = ["Ali", "Vali", "Sarvinoz"] ballar = [78, 91, 85] for ism, ball in zip(ismlar, ballar): print(f"{ism:<10}{ball}")
Ali 78 Vali 91 Sarvinoz 85
Ikki ro'yxatning mos elementlarini qo'shish:
oktabr = [120, 95, 140] noyabr = [130, 100, 125] jami = [] for a, b in zip(oktabr, noyabr): jami.append(a + b) print(jami)
[250, 195, 265]
Eslatma
Ro'yxatlar uzunligi har xil bo'lsa, zip() qisqasi tugaganda to'xtaydi va ortiqcha elementlar jimgina tashlab yuboriladi. Uzunliklar teng ekanini avval len() bilan tekshiring.
Kortejlar ro'yxati
Har bir yozuv bir nechta qismdan iborat bo'lsa, kortejlar ro'yxati qulay:
talabalar = [("Ali", 78), ("Vali", 91), ("Sarvinoz", 85)] for ism, ball in talabalar: print(ism, ball) eng_yaxshi = max(talabalar, key=lambda t: t[1]) print("Eng yaxshi:", eng_yaxshi)
Ali 78
Vali 91
Sarvinoz 85
Eng yaxshi: ('Vali', 91)key=lambda t: t[1] — "solishtirishda har bir kortejning 1-elementiga (ballga) qara". lambda — bitta qatorli funksiya, uni 14-bobda batafsil o'rganamiz; hozircha shu andozani yodda tuting.
Kitoblarda
- Python asoslari: Tuple (kortej) 38–42-betlar.
- Python Crash Course: 4-bob, Tuples 65–67-betlar.
Xulosa
- Kortej
(a, b, c)— o'zgarmas ro'yxat; bitta elementli —(a,). x, y = nuqta— ochish;a, *qolgani = ...— qolganini yig'ish.enumerate(r, start=1)—(raqam, qiymat)juftlari.zip(a, b)— ikki ro'yxat yonma-yon; qisqasida to'xtaydi.
Mashqlar
Ismlar bitta qatorda probel bilan berilgan. Ularni 1. Ism ko'rinishida raqamlab, har birini alohida qatorda chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| Ali Vali Sarvinoz | 1. Ali 2. Vali 3. Sarvinoz |
| Otabek | 1. Otabek |
Yechimni ko'rish
for i, ism in enumerate(input().split(), start=1): print(f"{i}. {ism}")
Ikki qatorda bir xil uzunlikdagi ikkita sonlar ro'yxati berilgan. Mos elementlarining ko'paytmalari yig'indisini toping (skalyar ko'paytma): a₁·b₁ + a₂·b₂ + ...
| Kirish | Kutilgan natija |
|---|---|
| 1 2 3, 4 5 6 | 32 |
| 2, 10 | 20 |
| 1 0 -1, 5 7 5 | 0 |
Yechimni ko'rish
a = input().split() b = input().split() s = 0 for x, y in zip(a, b): s += int(x) * int(y) print(s)
Ikki nuqtaning koordinatalari ikki qatorda x y ko'rinishida berilgan. Ular orasidagi masofani toping. Maslahat: x1, y1 = input().split().
| Kirish | Kutilgan natija |
|---|---|
| 0 0, 3 4 | 5 |
| 1 2, 4 6 | 5 |
| -1 -1, 2 3 | 5 |
Yechimni ko'rish
import math x1, y1 = input().split() x2, y2 = input().split() print(math.dist((float(x1), float(y1)), (float(x2), float(y2))))
Sonlar ro'yxati berilgan. Eng kichik sonning barcha indekslarini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 3 1 4 1 5 | 1 3 |
| 7 | 0 |
| 2 2 2 | 0 1 2 |
Yechimni ko'rish
r = [] for s in input().split(): r.append(int(s)) eng = min(r) for i, x in enumerate(r): if x == eng: print(i, end=" ")
Hafta kuni raqami (1–7) berilgan. Kun nomini chiqaring. Kunlarni kortejda saqlang: dushanba ... yakshanba. Raqam noto'g'ri bo'lsa — Xato.
| Kirish | Kutilgan natija |
|---|---|
| 1 | dushanba |
| 7 | yakshanba |
| 9 | Xato |
Yechimni ko'rish
HAFTA = ("dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba", "yakshanba") n = int(input()) if 1 <= n <= 7: print(HAFTA[n - 1]) else: print("Xato")
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.