7-bo‘lim
Ro'yxatlar va kortejlar
Bir nechta qiymatni birga saqlash: list va tuple, ularning metodlari, farqi va qachon qaysi birini tanlash kerakligi.
Ushbu bo‘lim mundarijasi
- Ro'yxat (list)
- Elementga murojaat
- Ro'yxat metodlari
- Element qo'shish
- Element o'chirish
- Tartiblash va qidirish
- Foydali funksiyalar
- Metodlar jadvali
- Nusxa olishdagi tuzoq
- Ichma-ich ro'yxatlar
- Kortej (tuple)
- Nima uchun kortej kerak?
- Ochish (unpacking)
- list va tuple taqqoslash
- Ro'yxat generatorlari (list comprehension)
- Amaliy misol: baho jurnali
- Xulosa
Bitta o'zgaruvchida bitta qiymat saqlash yetarli emas. Guruhdagi 30 ta talabaning bahosini saqlash uchun 30 ta o'zgaruvchi yaratmaysiz - ro'yxat ishlatasiz.
Ro'yxat (list) #
Ro'yxat - kvadrat qavslar ichidagi, vergul bilan ajratilgan qiymatlar to'plami.
shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"]
baholar = [85, 92, 78, 95, 88]
aralash = ["Husanboy", 25, 4.5, True] # turli turlar bir ro'yxatda
bosh_royxat = []
print(shaharlar)
print(len(baholar))
['Toshkent', 'Samarqand', 'Buxoro', 'Xiva']
5
Elementga murojaat #
Satrlardagi kabi indekslash ishlaydi:
shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"]
print(shaharlar[0]) # birinchi
print(shaharlar[-1]) # oxirgi
print(shaharlar[1:3]) # kesish ham ishlaydi
Toshkent
Xiva
['Samarqand', 'Buxoro']
Satrdan farqli o'laroq, ro'yxat elementini o'zgartirish mumkin:
shaharlar = ["Toshkent", "Samarqand"]
shaharlar[1] = "Andijon"
print(shaharlar)
['Toshkent', 'Andijon']
Ro'yxat metodlari #
Element qo'shish #
mevalar = ["olma", "anor"]
mevalar.append("uzum") # oxiriga qo'shish
print(mevalar)
mevalar.insert(1, "shaftoli") # ma'lum joyga qo'yish
print(mevalar)
mevalar.extend(["banan", "kivi"]) # boshqa ro'yxatni qo'shish
print(mevalar)
['olma', 'anor', 'uzum']
['olma', 'shaftoli', 'anor', 'uzum']
['olma', 'shaftoli', 'anor', 'uzum', 'banan', 'kivi']
append va extend farqia = [1, 2]
a.append([3, 4])
print(a) # [1, 2, [3, 4]] -- ichma-ich ro'yxat!
b = [1, 2]
b.extend([3, 4])
print(b) # [1, 2, 3, 4] -- yassi ro'yxat
Element o'chirish #
mevalar = ["olma", "anor", "uzum", "banan"]
mevalar.remove("anor") # qiymat bo'yicha
print(mevalar)
oxirgi = mevalar.pop() # oxirgisini olib tashlaydi va qaytaradi
print(oxirgi, "->", mevalar)
birinchi = mevalar.pop(0) # indeks bo'yicha
print(birinchi, "->", mevalar)
del mevalar[0] # del operatori
print(mevalar)
mevalar.clear() # hammasini tozalash
print(mevalar)
['olma', 'uzum', 'banan']
banan -> ['olma', 'uzum']
olma -> ['uzum']
[]
[]
Tartiblash va qidirish #
baholar = [85, 92, 78, 95, 88]
print(sorted(baholar)) # yangi ro'yxat qaytaradi
print(baholar) # asli o'zgarmadi
baholar.sort() # o'z joyida tartiblaydi
print(baholar)
baholar.sort(reverse=True) # kamayish tartibida
print(baholar)
baholar.reverse() # teskari o'girish
print(baholar)
print(baholar.index(92)) # indeksni topish
print(baholar.count(85)) # necha marta uchraydi
[78, 85, 88, 92, 95]
[85, 92, 78, 95, 88]
[78, 85, 88, 92, 95]
[95, 92, 88, 85, 78]
[78, 85, 88, 92, 95]
3
1
sort() va sorted() farqisort() | sorted() | |
|---|---|---|
| Nima qiladi | Asl ro'yxatni o'zgartiradi | Yangi ro'yxat qaytaradi |
| Qaytaradi | None | Yangi ro'yxat |
| Ishlaydi | Faqat ro'yxatda | Har qanday ketma-ketlikda |
natija = [3, 1, 2].sort()
print(natija) # None -- eng ko'p uchraydigan xato!
Foydali funksiyalar #
baholar = [85, 92, 78, 95, 88]
print("Eng yuqori:", max(baholar))
print("Eng past: ", min(baholar))
print("Yig'indi: ", sum(baholar))
print("O'rtacha: ", sum(baholar) / len(baholar))
print("92 bormi: ", 92 in baholar)
Eng yuqori: 95
Eng past: 78
Yig'indi: 438
O'rtacha: 87.6
92 bormi: True
Metodlar jadvali #
| Metod | Vazifasi |
|---|---|
.append(x) | Oxiriga bitta element qo'shadi |
.insert(i, x) | i indeksga qo'yadi |
.extend(list) | Boshqa ro'yxat elementlarini qo'shadi |
.remove(x) | Birinchi uchragan x ni o'chiradi |
.pop(i) | Elementni olib tashlaydi va qaytaradi |
.clear() | Hammasini o'chiradi |
.index(x) | x ning indeksini qaytaradi |
.count(x) | x necha marta uchrashini sanaydi |
.sort() | O'z joyida tartiblaydi |
.reverse() | Tartibni teskari qiladi |
.copy() | Sayoz nusxa qaytaradi |
Nusxa olishdagi tuzoq #
asl = [1, 2, 3]
xato_nusxa = asl # bu nusxa EMAS
xato_nusxa.append(4)
print("Asl:", asl) # asl ham o'zgardi!
asl = [1, 2, 3]
togri_nusxa = asl.copy() # yoki asl[:] yoki list(asl)
togri_nusxa.append(4)
print("Asl:", asl)
print("Nusxa:", togri_nusxa)
Asl: [1, 2, 3, 4]
Asl: [1, 2, 3]
Nusxa: [1, 2, 3, 4]
Ichma-ich ro'yxatlar #
Jadval ko'rinishidagi ma'lumotlar uchun:
jadval = [
["Husanboy", 85, 92],
["Sardor", 78, 88],
["Malika", 95, 91],
]
print(jadval[0]) # birinchi qator
print(jadval[0][0]) # birinchi qator, birinchi ustun
print(jadval[2][2]) # Malikaning ikkinchi bahosi
for qator in jadval:
ism = qator[0]
ortacha = (qator[1] + qator[2]) / 2
print(f"{ism:<10}{ortacha:>6.1f}")
['Husanboy', 85, 92]
Husanboy
91
Husanboy 88.5
Sardor 83.0
Malika 93.0
Kortej (tuple) #
Kortej - o'zgarmas ro'yxat. Dumaloq qavslar bilan yoziladi.
koordinata = (41.311, 69.240) # Toshkent koordinatalari
ranglar = ("qizil", "yashil", "ko'k")
bitta_elementli = ("salom",) # vergulga e'tibor bering!
print(koordinata[0])
print(len(ranglar))
41.311
3
notogri = ("salom") # bu oddiy satr!
togri = ("salom",) # bu kortej
print(type(notogri))
print(type(togri))
<class 'str'>
<class 'tuple'>
Nima uchun kortej kerak? #
koordinata = (41.311, 69.240)
koordinata[0] = 50.0
TypeError: 'tuple' object does not support item assignment
Aynan shu himoya kortejning asosiy foydasi. O'zgarmasligi kerak bo'lgan ma'lumotlar uchun ishlating: koordinatalar, RGB ranglar, sozlamalar, ma'lumotlar bazasidan olingan qator.
Ochish (unpacking) #
talaba = ("Husanboy", 25, "Namangan")
ism, yosh, shahar = talaba
print(f"{ism}, {yosh} yosh, {shahar}")
# Yulduzcha bilan qolganini yig'ish
baholar = (85, 92, 78, 95, 88)
birinchi, *qolganlari = baholar
print(birinchi, qolganlari)
Husanboy, 25 yosh, Namangan
85 [92, 78, 95, 88]
list va tuple taqqoslash #
| Xususiyat | list | tuple |
|---|---|---|
| Yozilishi | [1, 2, 3] | (1, 2, 3) |
| O'zgartirish | Mumkin | Mumkin emas |
| Tezlik | Sekinroq | Tezroq |
| Xotira | Ko'proq | Kamroq |
| Lug'at kaliti bo'la oladimi | Yo'q | Ha |
| Qachon ishlatiladi | O'zgaradigan to'plam | O'zgarmas ma'lumot |
# Kortej lug'at kaliti bo'la oladi, ro'yxat esa yo'q
manzillar = {
(41.311, 69.240): "Toshkent",
(39.654, 66.960): "Samarqand",
}
print(manzillar[(41.311, 69.240)])
Toshkent
Ro'yxat generatorlari (list comprehension) #
Bu Python'ning eng chiroyli imkoniyatlaridan biri - siklni bitta satrga siqadi.
# Oddiy usul
kvadratlar = []
for son in range(1, 6):
kvadratlar.append(son ** 2)
print(kvadratlar)
# Generator bilan
kvadratlar = [son ** 2 for son in range(1, 6)]
print(kvadratlar)
# Shart bilan
juftlar = [son for son in range(1, 21) if son % 2 == 0]
print(juftlar)
# Matnlar ustida
shaharlar = ["toshkent", "samarqand", "buxoro"]
kattalar = [sh.title() for sh in shaharlar]
print(kattalar)
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
['Toshkent', 'Samarqand', 'Buxoro']
Agar generator bitta satrga sig'sa va o'qish oson bo'lsa - ishlating. Agar ichida ikkita shart va uchta sikl bo'lsa - oddiy for yozing. Qisqalik o'qishdan muhimroq emas.
Amaliy misol: baho jurnali #
# ============================================
# Guruh baholari statistikasi
# ============================================
talabalar = [
("Husanboy Qodirov", [85, 92, 78]),
("Sardor Aliyev", [70, 65, 80]),
("Malika Yusupova", [95, 91, 98]),
("Bekzod Rasulov", [60, 72, 68]),
]
print("=" * 52)
print(f"{'Talaba':<25}{'Baholar':<18}{'O‘rtacha':>10}")
print("=" * 52)
ortachalar = []
for ism, baholar in talabalar:
ortacha = sum(baholar) / len(baholar)
ortachalar.append(ortacha)
baho_matn = ", ".join(str(b) for b in baholar)
print(f"{ism:<25}{baho_matn:<18}{ortacha:>10.1f}")
print("=" * 52)
print(f"{'Guruh o‘rtachasi:':<40}{sum(ortachalar) / len(ortachalar):>11.1f}")
print(f"{'Eng yuqori natija:':<40}{max(ortachalar):>11.1f}")
print(f"{'Eng past natija:':<40}{min(ortachalar):>11.1f}")
alochilar = [ism for ism, baholar in talabalar if sum(baholar) / len(baholar) >= 85]
print(f"\nA'lochilar ({len(alochilar)} ta): {', '.join(alochilar)}")
====================================================
Talaba Baholar O'rtacha
====================================================
Husanboy Qodirov 85, 92, 78 85.0
Sardor Aliyev 70, 65, 80 71.7
Malika Yusupova 95, 91, 98 94.7
Bekzod Rasulov 60, 72, 68 66.7
====================================================
Guruh o'rtachasi: 79.5
Eng yuqori natija: 94.7
Eng past natija: 66.7
A'lochilar (2 ta): Husanboy Qodirov, Malika Yusupova
xarid_royxati.py dasturini yozing:
- Bo'sh ro'yxat yarating.
- Foydalanuvchidan 5 ta mahsulot nomini so'rab, ro'yxatga qo'shing.
- Ro'yxatni alifbo tartibida chiqaring.
- Eng uzun nomli mahsulotni toping.
- Foydalanuvchidan bitta nom so'rab, u ro'yxatda bor-yo'qligini
inbilan tekshiring.
Xulosa #
list- o'zgaruvchan,tuple- o'zgarmas to'plam.append,insert,extendqo'shadi;remove,pop,delo'chiradi.sort()asl ro'yxatni o'zgartiradi,sorted()yangisini qaytaradi.b = anusxa yaratmaydi -a.copy()ishlating.- Ro'yxat generatorlari (
[x for x in ...]) kodni ancha qisqartiradi.
Keyingi bo'limda lug'atlar va to'plamlar - kalit-qiymat juftliklari bilan ishlashni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.