7-bo‘lim

Ro'yxatlar va kortejlar

Bir nechta qiymatni birga saqlash: list va tuple, ularning metodlari, farqi va qachon qaysi birini tanlash kerakligi.

🕑 17 daqiqa o‘qish 📄 525 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ro'yxat (list)
  2. Elementga murojaat
  3. Ro'yxat metodlari
  4. Element qo'shish
  5. Element o'chirish
  6. Tartiblash va qidirish
  7. Foydali funksiyalar
  8. Metodlar jadvali
  9. Nusxa olishdagi tuzoq
  10. Ichma-ich ro'yxatlar
  11. Kortej (tuple)
  12. Nima uchun kortej kerak?
  13. Ochish (unpacking)
  14. list va tuple taqqoslash
  15. Ro'yxat generatorlari (list comprehension)
  16. Amaliy misol: baho jurnali
  17. 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.

Python
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))
Natija
['Toshkent', 'Samarqand', 'Buxoro', 'Xiva']
5

Elementga murojaat #

Satrlardagi kabi indekslash ishlaydi:

Python
shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"]

print(shaharlar[0])       # birinchi
print(shaharlar[-1])      # oxirgi
print(shaharlar[1:3])     # kesish ham ishlaydi
Natija
Toshkent
Xiva
['Samarqand', 'Buxoro']
Ro'yxat o'zgaruvchan (mutable)

Satrdan farqli o'laroq, ro'yxat elementini o'zgartirish mumkin:

Python
shaharlar = ["Toshkent", "Samarqand"]
shaharlar[1] = "Andijon"
print(shaharlar)
Natija
['Toshkent', 'Andijon']

Ro'yxat metodlari #

Element qo'shish #

Python
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)
Natija
['olma', 'anor', 'uzum']
['olma', 'shaftoli', 'anor', 'uzum']
['olma', 'shaftoli', 'anor', 'uzum', 'banan', 'kivi']
append va extend farqi
Python
a = [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 #

Python
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)
Natija
['olma', 'uzum', 'banan']
banan -> ['olma', 'uzum']
olma -> ['uzum']
[]
[]

Tartiblash va qidirish #

Python
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
Natija
[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() farqi
sort()sorted()
Nima qiladiAsl ro'yxatni o'zgartiradiYangi ro'yxat qaytaradi
QaytaradiNoneYangi ro'yxat
IshlaydiFaqat ro'yxatdaHar qanday ketma-ketlikda
Python
natija = [3, 1, 2].sort()
print(natija)          # None -- eng ko'p uchraydigan xato!

Foydali funksiyalar #

Python
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)
Natija
Eng yuqori: 95
Eng past:   78
Yig'indi:   438
O'rtacha:   87.6
92 bormi:   True

Metodlar jadvali #

MetodVazifasi
.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 #

NOTO'G'RI: b = a a b [1, 2, 3] bitta obyekt TO'G'RI: b = a.copy() a b [1, 2, 3] [1, 2, 3] ikkita alohida obyekt
Oddiy o'zlashtirish nusxa yaratmaydi - ikkala nom bitta ro'yxatga ishora qiladi
Python
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)
Natija
Asl: [1, 2, 3, 4]
Asl: [1, 2, 3]
Nusxa: [1, 2, 3, 4]

Ichma-ich ro'yxatlar #

Jadval ko'rinishidagi ma'lumotlar uchun:

Python
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}")
Natija
['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.

Python
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))
Natija
41.311
3
Bitta elementli kortej
Python
notogri = ("salom")       # bu oddiy satr!
togri = ("salom",)        # bu kortej

print(type(notogri))
print(type(togri))
Natija
<class 'str'>
<class 'tuple'>

Nima uchun kortej kerak? #

Python
koordinata = (41.311, 69.240)
koordinata[0] = 50.0
Natija
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) #

Python
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)
Natija
Husanboy, 25 yosh, Namangan
85 [92, 78, 95, 88]

list va tuple taqqoslash #

Xususiyatlisttuple
Yozilishi[1, 2, 3](1, 2, 3)
O'zgartirishMumkinMumkin emas
TezlikSekinroqTezroq
XotiraKo'proqKamroq
Lug'at kaliti bo'la oladimiYo'qHa
Qachon ishlatiladiO'zgaradigan to'plamO'zgarmas ma'lumot
Python
# 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)])
Natija
Toshkent

Ro'yxat generatorlari (list comprehension) #

Bu Python'ning eng chiroyli imkoniyatlaridan biri - siklni bitta satrga siqadi.

Python
# 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)
Natija
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
['Toshkent', 'Samarqand', 'Buxoro']
Qachon generator ishlatish kerak?

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 #

Python
# ============================================
# 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)}")
Natija
====================================================
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
Amaliy topshiriq

xarid_royxati.py dasturini yozing:

  1. Bo'sh ro'yxat yarating.
  2. Foydalanuvchidan 5 ta mahsulot nomini so'rab, ro'yxatga qo'shing.
  3. Ro'yxatni alifbo tartibida chiqaring.
  4. Eng uzun nomli mahsulotni toping.
  5. Foydalanuvchidan bitta nom so'rab, u ro'yxatda bor-yo'qligini in bilan tekshiring.

Xulosa #

  • list - o'zgaruvchan, tuple - o'zgarmas to'plam.
  • append, insert, extend qo'shadi; remove, pop, del o'chiradi.
  • sort() asl ro'yxatni o'zgartiradi, sorted() yangisini qaytaradi.
  • b = a nusxa 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.

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.