Asosiy qismga o'tish

Kortej (tuple), enumerate() va zip()

10-bob 18 kod bloki 1398 so'z

Bu bobda

  • o'zgarmas ro'yxat — kortej (tuple) nima va qachon kerakligini
  • qiymatlarni "ochish" (unpacking) ni
  • enumerate() bilan indeks va qiymatni birga olishni
  • zip() 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:

python5 qator
nuqta = (41.31, 69.28)
ranglar = ("qizil", "sariq", "yashil")
print(nuqta[0], ranglar[-1])
print(len(ranglar))
print(type(ranglar))
Natija
41.31 yashil
3
<class 'tuple'>

Indeks, kesish, in, len, for — hammasi ro'yxatdagidek ishlaydi. Faqat o'zgartirish taqiqlangan:

python2 qator
ranglar = ("qizil", "sariq", "yashil")
ranglar[0] = "ko'k"
Xato xabari
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.
python4 qator
HAFTA = ("dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba", "yakshanba")
print(HAFTA[4])
print("shanba" in HAFTA)
print(HAFTA.index("yakshanba") + 1, "- kun")
Natija
juma
True
7 - kun

Baribir o'zgartirish kerak bo'lsa: ro'yxatga o'girib, o'zgartirib, qaytadan kortejga o'giramiz:

python5 qator
a = ("daftar", "qalay", "ot")
r = list(a)
r[1] = "qalam"
a = tuple(r)
print(a)
Natija
('daftar', 'qalam', 'ot')

Bitta elementli kortej

python3 qator
a = (5)
b = (5,)
print(type(a), type(b))
Natija
<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:

python6 qator
nuqta = (3, 4)
x, y = nuqta
print(f"x = {x}, y = {y}")

ism, yosh, shahar = ("Sarvinoz", 19, "Buxoro")
print(f"{ism}, {yosh} yosh, {shahar}")
Natija
x = 3, y = 4
Sarvinoz, 19 yosh, Buxoro

Chapdagi nomlar soni elementlar soniga teng bo'lishi kerak. Ortiqchasini * yig'ib oladi:

python3 qator
birinchi, *qolgani = [5, 4, 3, 2, 1]
print(birinchi)
print(qolgani)
Natija
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:

python3 qator
mevalar = ["olma", "anor", "behi"]
for i, meva in enumerate(mevalar):
    print(i, meva)
Natija
0 olma
1 anor
2 behi

start=1 — odamlar uchun 1 dan sanash:

python3 qator
navbat = ["Ali", "Vali", "Sarvinoz"]
for raqam, ism in enumerate(navbat, start=1):
    print(f"{raqam}. {ism}")
Natija
1. Ali
2. Vali
3. Sarvinoz

9-bobdagi "eng yuqori ball qaysi o'rinda" masalasi endi tushunarliroq:

python6 qator
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")
Natija
5-talaba: 95 ball

zip(): ikki ro'yxatni juftlash

zip() bir nechta ro'yxatni yonma-yon yurib, har qadamda bittadan element beradi:

python4 qator
ismlar = ["Ali", "Vali", "Sarvinoz"]
ballar = [78, 91, 85]
for ism, ball in zip(ismlar, ballar):
    print(f"{ism:<10}{ball}")
Natija
Ali       78
Vali      91
Sarvinoz  85

Ikki ro'yxatning mos elementlarini qo'shish:

python6 qator
oktabr = [120, 95, 140]
noyabr = [130, 100, 125]
jami = []
for a, b in zip(oktabr, noyabr):
    jami.append(a + b)
print(jami)
Natija
[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:

python5 qator
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)
Natija
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

10.1

Ismlar bitta qatorda probel bilan berilgan. Ularni 1. Ism ko'rinishida raqamlab, har birini alohida qatorda chiqaring.

KirishKutilgan natija
Ali Vali Sarvinoz1. Ali 2. Vali 3. Sarvinoz
Otabek1. Otabek
Yechimni ko'rish
python2 qator
for i, ism in enumerate(input().split(), start=1):
    print(f"{i}. {ism}")
10.2

Ikki qatorda bir xil uzunlikdagi ikkita sonlar ro'yxati berilgan. Mos elementlarining ko'paytmalari yig'indisini toping (skalyar ko'paytma): a₁·b₁ + a₂·b₂ + ...

KirishKutilgan natija
1 2 3, 4 5 632
2, 1020
1 0 -1, 5 7 50
Yechimni ko'rish
python6 qator
a = input().split()
b = input().split()
s = 0
for x, y in zip(a, b):
    s += int(x) * int(y)
print(s)
10.3

Ikki nuqtaning koordinatalari ikki qatorda x y ko'rinishida berilgan. Ular orasidagi masofani toping. Maslahat: x1, y1 = input().split().

KirishKutilgan natija
0 0, 3 45
1 2, 4 65
-1 -1, 2 35
Yechimni ko'rish
python4 qator
import math
x1, y1 = input().split()
x2, y2 = input().split()
print(math.dist((float(x1), float(y1)), (float(x2), float(y2))))
10.4

Sonlar ro'yxati berilgan. Eng kichik sonning barcha indekslarini chiqaring.

KirishKutilgan natija
3 1 4 1 51 3
70
2 2 20 1 2
Yechimni ko'rish
python7 qator
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=" ")
10.5

Hafta kuni raqami (1–7) berilgan. Kun nomini chiqaring. Kunlarni kortejda saqlang: dushanba ... yakshanba. Raqam noto'g'ri bo'lsa — Xato.

KirishKutilgan natija
1dushanba
7yakshanba
9Xato
Yechimni ko'rish
python6 qator
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.

Telegramda yozish Narxlar