List comprehension

List comprehension

Future Dreams

List comprehension - bu nima?

Asosiy vazifasi

"List comprehension" buni o'zbekchaga tarjima qilmay qo'ya qoldim. Uni shunday nomlayvering, sababi u haqda ma'lumot kerak bo'b qolsa internetdan qidirish sizga qiyinchilik tug'dirmaydi.


Biz undan listlarni tez va oson tayyorlashda foydalanamiz. Bu uning bosh vazifasi, lekin imkoniyatlari bundan ko'proq. U orqali hatto setdan tortib dictgacha tayyorlasa bo'ladi!

Asosiy sintaksis

Sintaksis nimaligini bilmasangiz, buni shunchaki yozish qoidasi deb tushunishingiz mumkin. Belgilarni qay tartibda yozishni biz sintaksis deymiz. Demak, list comprehensionda asosiy sintaksis:

yangi_list = [a for a in eski_list]

Bunda biz eski_list dan bittadan element olib, uni yangi listga kirityapmiz. Bu kodni mana bunday yozib bajarsayam bo'ladi:

yangi_list = []
for a in eski_list:
yangi_list.append(a)

Bu yuqoridagi kod bilan aynan bir xil vazifa bajaradi, lekin ancha uzunroq.

...[a for... mana bu yerdagi a yangi hosil bo'layotgan listga qo'shilayotgan element. Aynan uning ustida bajaramiz kerakli amallarni. Masalan, agar yangi listga har bir a ni stringga o'tkazib qo'shmoqchi bo'lsak, uni bunday qilamiz:

yangi_list = [str(a) for a in eski_list]

Yoki har bir elementni integerga o'tkazib keyin unga bir qo'shmoqchi bo'lsak bunday qilamiz:

yangi_list = [int(a) + 1 for a in eski_list]

Shunga o'xshash barcha amallarni shunday tartibda bajaramiz.

Agar biz eski listimizdagi faqat juft sonlarni yangi listga ko'chirmoqchi bo'lsak, buni qanday qilamiz? Uni odatda bunday bajaramiz:

yangi_list = []
for a in eski_list:
if a % 2 == 0:
yangi_list.append(a)

Bunda % operatori qoldiqni hisoblaydi. 3 ni 2 ga bo'lganda qoldiq 1 ga teng. 3 % 2 ham 1 natija qaytaradi. Biz bu shart orqali "agar sonni 2 ga bo'lganda qoldiq 0 ga teng bo'lsa" deb buyruq berdik. Endi buni list comprehension orqali bajaramiz:

[a for a in eski_list if a % 2 == 0]

Bitta emas bir nechta shart kiritishimiz ham mumkin:

[a for a in eski_list if a % 2 == 0 and a > 1]

Biz endi "agar son 2 ga qoldiqsiz bo'linsa va 1 dan katta bo'lsa" deb shart kiritdik. Shunday tarzda xohlagancha shart kiritish mumkin.

Set hosil qilish

List comprehension orqali set ham hosil qilish mumkin. Set bu listga o'xshash tur, faqat undagi elementlar takrorlanmaydi. Ya'ni bitta listga biz 7 raqamini bir necha marta qo'shishimiz mumkin, lekin setga faqat bir marta qo'shiladi, keyingi safar qo'shganingizda u hisobga olinmaydi (set haqida batafsil bilish uchun guruhdan so'rang, yoki internetdan qidiring). Buning uchun shunchaki kodni [] emas {} ichiga yozish kerak:

{a for a in eski_list if a % 2 == 0}

Dict hosil qilish

Dictda har bir element key : value shaklida bo'ladi va u ham set kabi {} ichida yoziladi. Masalan:

odam = {'ism': 'Ali', 'yosh': 20}

odam['ism'] qilsak u 'Ali' degan qiymat qaytaradi. odam['yosh'] orqali 20 degan qiymatni olamiz (agar dict haqida batafsil bilmoqchi bo'lsangiz guruhdan so'rang yoki internetdan qidiring, agar uyam to'g'ri kelmasa navbatdagi maqolani kuting). Demak, dict hosil qilamiz:

kvadrat = {a: a**2 for a in [1, 2, 3]}

Mana biz sonlarning kvadratlaridan iborat dict hosil qildik. ** operatori darajaga ko'tarishni bildiradi.

a**b bu a ning b-darajasi degani. Masalan, 2**3 (2 ning 3-darajasi, yoki 2*2*2) 8 ga teng.

Endi hosil qilgan dictimizni ishlatib ko'ramiz:

kvadrat[2]
>>> 4
kvadrat[3]
>>> 9

Shart kiritish ham odatdagidek bo'ladi. Deylik, faqat toq sonalarni darajalari bo'lsin degan shart kiritish kerak bo'lsin. Uni quyidagicha bajaramiz:

{a: a**2 for a in [1, 2, 3] if a % 2 != 0}

if a % 2 != 0 bu shart "agar son 2 ga bo'linganda qoldiq 0 ga teng emas bo'lsa (!= bu teng emas degani)" degan ma'noni bildiradi. Boshqa shartlarni ham shu tahlika kiritish mumkin.

Nega endi buni ishlatishimiz kerak?

Yaxshi savol. Birinchidan, bu orqali kod hajmini qisqartiramiz, ikkinchidan bu odatdagi sikldan tezkorroq ishlaydi. Demak biz bir o'q bilan naqd 2 ta quyonni uryapmiz. Nega endi uni ishlatmasligimiz kerak!

Hozircha bilganlarim shular. Fikrlar va savollarni guruhda kutib qolaman.


Report Page