Ro'yxatlar (list)

Sinfda 30 ta o'quvchi bo'lsa, ularning baholarini 30 ta alohida o'zgaruvchida saqlaysizmi? baho1, baho2, ..., baho30? Albatta yo'q. Buning uchun Python'da ro'yxatlar bor — eng ko'p ishlatiladigan ma'lumot tuzilmasi.

Bu darsda

  • Ro'yxat yaratish va uning elementlariga murojaat qilish
  • Elementlarni o'zgartirish, qo'shish va o'chirish
  • Ro'yxat bo'ylab for sikli
  • sum(), min(), max(), len() va saralash
  • enumerate() va ro'yxatni nusxalashdagi tuzoq

Ro'yxat yaratish

Ro'yxat (inglizcha list) — qiymatlarning tartiblangan to'plami. U kvadrat qavslar [ ] ichida yoziladi, elementlar vergul bilan ajratiladi:

mevalar = ["olma", "anor", "uzum", "behi"]
baholar = [5, 4, 5, 3, 4]
aralash = ["Ali", 17, True, 1.75]
bosh = []

print(mevalar)
print(baholar)
print(len(mevalar))
['olma', 'anor', 'uzum', 'behi']
[5, 4, 5, 3, 4]
4

Ro'yxatda istalgan turdagi qiymatlar bo'lishi mumkin, hatto aralash holda ham. Lekin amalda odatda bir xil turdagi narsalar saqlanadi: ismlar ro'yxati, narxlar ro'yxati va hokazo.

Ro'yxat — poyezdga o'xshaydi. Har bir vagon — element, vagonlarning tartib raqami bor (0 dan boshlab), poyezdga yangi vagon ulash yoki birini olib tashlash mumkin.

Indekslar

Ro'yxat elementlariga xuddi satrdagi belgilarga murojaat qilgandek, indeks orqali murojaat qilinadi. Indekslar yana 0 dan boshlanadi:

mevalar = ["olma", "anor", "uzum", "behi"]
print(mevalar[0])
print(mevalar[2])
print(mevalar[-1])
print(mevalar[1:3])
olma
uzum
behi
['anor', 'uzum']

Kesmalar ham satrlardagidek ishlaydi va yangi ro'yxat qaytaradi.

Elementni o'zgartirish

Satrdan farqli o'laroq, ro'yxatni o'zgartirish mumkin. Indeks orqali elementga yangi qiymat beriladi:

mevalar = ["olma", "anor", "uzum"]
mevalar[0] = "nok"
print(mevalar)
['nok', 'anor', 'uzum']

Qo'shish va o'chirish

MetodNima qiladi
append(x)Oxiriga x ni qo'shadi
insert(i, x)i-o'ringa x ni qo'yadi
remove(x)Birinchi uchragan x ni o'chiradi
pop()Oxirgi elementni olib tashlaydi va qaytaradi
pop(i)i-elementni olib tashlaydi va qaytaradi
clear()Ro'yxatni butunlay bo'shatadi
navbat = ["Aziz", "Bekzod"]

navbat.append("Dilnoza")       # oxiriga qo'shildi
print(navbat)

navbat.insert(0, "Kamola")     # boshiga qo'shildi
print(navbat)

navbat.remove("Bekzod")        # nomi bo'yicha o'chirildi
print(navbat)

birinchi = navbat.pop(0)       # birinchisi navbatdan chiqdi
print(birinchi, "xizmat ko'rsatildi")
print(navbat)
['Aziz', 'Bekzod', 'Dilnoza']
['Kamola', 'Aziz', 'Bekzod', 'Dilnoza']
['Kamola', 'Aziz', 'Dilnoza']
Kamola xizmat ko'rsatildi
['Aziz', 'Dilnoza']

Ro'yxatda yo'q elementni remove() qilsangiz, ValueError chiqadi. Shuning uchun avval in bilan tekshirish foydali:

mevalar = ["olma", "anor", "uzum"]
if "banan" in mevalar:
    mevalar.remove("banan")
else:
    print("Ro'yxatda banan yo'q")

Ro'yxat bo'ylab sikl

for sikli ro'yxat bilan juda tabiiy ishlaydi — har bir element uchun bir marta:

shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"]
for shahar in shaharlar:
    print(f"{shahar} — {len(shahar)} ta harf")

enumerate() — tartib raqami bilan

Element bilan birga uning tartib raqami ham kerak bo'lsa, enumerate() ishlatiladi. Ikkinchi argument raqamlash nechadan boshlanishini bildiradi:

vazifalar = ["Non olish", "Dars qilish", "Sport bilan shug'ullanish"]
for raqam, vazifa in enumerate(vazifalar, 1):
    print(f"{raqam}. {vazifa}")
1. Non olish
2. Dars qilish
3. Sport bilan shug'ullanish

Sonli ro'yxatlar bilan ishlash

Sonlardan iborat ro'yxatlar uchun tayyor funksiyalar bor:

baholar = [5, 4, 5, 3, 4, 5]
print("Soni:", len(baholar))
print("Yig'indisi:", sum(baholar))
print("Eng yuqori:", max(baholar))
print("Eng past:", min(baholar))
print("O'rtacha:", round(sum(baholar) / len(baholar), 2))
print("Nechta besh:", baholar.count(5))
Soni: 6
Yig'indisi: 26
Eng yuqori: 5
Eng past: 3
O'rtacha: 4.33
Nechta besh: 3

Saralash

Ro'yxatni tartiblashning ikki usuli bor:

sonlar = [42, 7, 19, 3, 25]
print(sorted(sonlar))
print(sonlar)            # asl ro'yxat o'zgarmadi

sonlar.sort(reverse=True)
print(sonlar)            # endi o'zi kamayish tartibida

ismlar = ["Zafar", "Anvar", "Malika"]
ismlar.sort()
print(ismlar)
[3, 7, 19, 25, 42]
[42, 7, 19, 3, 25]
[42, 25, 19, 7, 3]
['Anvar', 'Malika', 'Zafar']

reverse() metodi esa ro'yxatni saralamasdan, shunchaki teskari tartibga o'giradi.

Ro'yxatni to'ldirish

Ko'pincha ro'yxat bo'sh holda yaratiladi va sikl ichida to'ldiriladi:

xaridlar = []
while True:
    narsa = input("Nima olish kerak? (tugatish uchun bo'sh qoldiring): ")
    if narsa == "":
        break
    xaridlar.append(narsa)

print(f"\nXaridlar ro'yxati ({len(xaridlar)} ta):")
for i, narsa in enumerate(xaridlar, 1):
    print(f"{i}. {narsa}")

Satrdan ro'yxatga va aksincha

9-darsdagi split() satrdan ro'yxat yasaydi, join() esa aksincha. Bu ko'pincha birga ishlatiladi:

gap = "Python o'rganish juda qiziqarli"
sozlar = gap.split()
print(sozlar)
print(len(sozlar), "ta so'z")
print(" ".join(sozlar[::-1]))

Diqqat: ro'yxatni nusxalash

Bu tuzoqqa deyarli hamma bir marta tushadi:

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]

Biz faqat b ga qo'shdik, lekin a ham o'zgardi! Sababi: b = a yangi ro'yxat yaratmaydi — u xuddi o'sha ro'yxatga ikkinchi nom beradi. Ikkala yorliq bitta qutiga yopishtirilgan. Haqiqiy nusxa kerak bo'lsa, copy() ishlating:

a = [1, 2, 3]
b = a.copy()
b.append(4)
print("a:", a)
print("b:", b)

Bonus: Python'da ro'yxatni bitta qatorda yaratishning qisqa usuli bor — ro'yxat generatori: [son * 2 for son in sonlar]. Bu «sonlar dagi har bir son uchun son * 2» degani. Hozircha uni yodlash shart emas, lekin boshqa odamlarning kodida ko'p uchratasiz.

sonlar = [1, 2, 3, 4, 5]
kvadratlar = [son ** 2 for son in sonlar]
print(kvadratlar)

Mashqlar

1-mashq Baholar tahlili

Ro'yxatda nechta «5» borligini va o'rtacha bahoni (2 xona aniqlikda) chiqaring.

A'lo baholar: 3
O'rtacha: 4.33
baholar = [5, 4, 3, 5, 5, 4]
Yechimni ko'rish
baholar = [5, 4, 3, 5, 5, 4]
print("A'lo baholar:", baholar.count(5))
print("O'rtacha:", round(sum(baholar) / len(baholar), 2))

2-mashq Eng issiq kun

max() funksiyasidan foydalanmasdan, sikl yordamida haftaning eng yuqori haroratini toping.

haroratlar = [23, 31, 28, 35, 19, 30, 27]
Ishora

Avval birinchi elementni eng katta deb oling: eng_katta = haroratlar[0]. Keyin har bir element bilan solishtirib, kattarog'i chiqsa — yangilang.

Yechimni ko'rish
haroratlar = [23, 31, 28, 35, 19, 30, 27]
eng_katta = haroratlar[0]
for t in haroratlar:
    if t > eng_katta:
        eng_katta = t
print(eng_katta)

3-mashq Juft sonlarni ajrating

Berilgan ro'yxatdan faqat juft sonlardan iborat yangi ro'yxat yasang va uni chiqaring.

sonlar = [12, 7, 3, 18, 21, 40, 5]
juftlar = []
Yechimni ko'rish
sonlar = [12, 7, 3, 18, 21, 40, 5]
juftlar = []
for son in sonlar:
    if son % 2 == 0:
        juftlar.append(son)
print(juftlar)

4-mashq Uzun so'zlar

Gapdagi 6 tadan ko'p harfli so'zlarni har birini alohida qatorda chiqaring.

gap = "Dasturlash mantiqiy fikrlashni yaxshi rivojlantiradi"
Yechimni ko'rish
gap = "Dasturlash mantiqiy fikrlashni yaxshi rivojlantiradi"
for soz in gap.split():
    if len(soz) > 6:
        print(soz)

«yaxshi» so'zida roppa-rosa 6 ta harf bor, shuning uchun u chiqmaydi: «6 tadan ko'p» — bu > 6, >= 6 emas.

O'zingizni sinang

x = [10, 20, 30, 40] bo'lsa, x[-1] nimaga teng?

  1. 10
  2. 30
  3. 40
  4. Xato beradi

To'g'ri. -1 — oxirgi element.

Ro'yxat oxiriga element qo'shish uchun qaysi metod ishlatiladi?

  1. append()
  2. add()
  3. push()
  4. insert()

To'g'ri. insert() esa istalgan o'ringa qo'yadi.

sorted(sonlar) va sonlar.sort() ning farqi nimada?

  1. Hech qanday farqi yo'q
  2. sorted() yangi ro'yxat qaytaradi, sort() esa ro'yxatning o'zini o'zgartiradi
  3. sort() faqat sonlarni saralaydi
  4. sorted() kamayish tartibida saralaydi

To'g'ri. Asl ro'yxat kerak bo'lsa — sorted() ishlating.

Quyidagi kod nima chiqaradi?

a = [1, 2]
b = a
b.append(3)
print(len(a))
  1. 2
  2. 1
  3. Xato beradi
  4. 3

To'g'ri. a va b — bitta ro'yxatning ikki nomi. Nusxa uchun a.copy() kerak edi.

Xulosa

  • Ro'yxat — [ ] ichidagi tartiblangan qiymatlar to'plami. Indekslar 0 dan boshlanadi.
  • Ro'yxatni o'zgartirish mumkin: royxat[0] = yangi.
  • append, insert — qo'shadi; remove, pop — o'chiradi.
  • len, sum, min, max, count — tayyor hisob-kitoblar; sort() va sorted() — saralash.
  • for element in royxat: — ro'yxat bo'ylab yurish; enumerate() — raqami bilan.
  • b = a nusxa yaratmaydi — a.copy() ishlating.