List Comprehensions

Ro'yxat komprehensiyasi sizga boshqa to'plamdan, masalan, boshqa ro'yxat yoki lug'atdan ro'yxat yaratishga imkon beradi.

Ro'yxat Komprehensiyalari

Ro'yxat komprehensiyasi sizga boshqa to'plamdan, masalan, boshqa ro'yxat yoki lug'atdan ro'yxat yaratishga imkon beradi. Ro'yxat komprehensiyasi, ro'yxat kabi, kvadrat qavslar bilan boshlanadi va tugaydi, []; u shuningdek, bir satrda o'z ichiga olingan for siklini ham o'z ichiga oladi. Bu, ixtiyoriy ravishda, nol yoki ko'proq for yoki if shartlari bilan davom ettirilishi mumkin (kvadrat qavslar ichida).

Mana bir misol:

>>> sequence = [1, 2, 3]
>>> new_list = [x for x in sequence]

Bu quyidagi siklga teng:

>>> sequence = [1, 2, 3]
>>> new_list = []
>>> for x in sequence:
... new_list.append(x)
>>> new_list
[1, 2, 3]

Odatda, siz ro'yxat komprehensiyasini ishlatganingizda, to'plamdagi har bir elementga biron narsa qilmoqchisiz. Masalan, har bir elementni ikki barobarga oshirishni sinab ko'raylik:

>>> sequence = [1, 2, 3]
>>> new_list = [x * 2 for x in sequence]
>>> new_list
[2, 4, 6]

Bu misolda, ketma-ketlikdagi har bir element (x) x-ni 2 ga ko'paytirasiz.

Ro'yxat Komprehensiyalarida Filtratsiya

Siz ro'yxat komprehensiyasiga filtr sifatida if bayonotini qo'shishingiz mumkin. Python-da butun sonni qabul qiladigan range() funksiyasi mavjud. U, shuningdek, sizga 0 dan boshlanadigan va siz bergan butun son minus birga tugaydigan bir ketma-ket sonlarni olish imkonini beruvchi iterable range obyektini qaytaradi.

Mana bu qanday ishlaydi:

>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Siz Python-ning list() funksiyasidan foydalanib, range obyektini 0-9 gacha sonlar ro'yxatiga aylantirishingiz mumkin.

Endi, agar siz faqat ularning ichida toq sonlarni o'z ichiga olgan ro'yxat yaratmoqchi bo'lsangiz, siz if bayonoti bilan ro'yxat komprehensiyasini ishlatishingiz mumkin:

>>> odd_numbers = [x for x in range(10) if x % 2]
>>> odd_numbers
[1, 3, 5, 7, 9]

Keling, ro'yxat komprehensiyasida ichki for sikllaridan foydalanib ko'raylik. Ushbu mashq uchun siz lug'at yaratib, uni tuple'lar ro'yxatiga aylantirasiz:

>>> my_dict = {1: 'dog', 2: 'cat', 3: 'python'}
>>> [(num, animal) for num in my_dict for animal in my_dict.values() if my_dict[num] == animal]
>>> [(1, 'dog'), (2, 'cat'), (3, 'python')]

Ushbu kod, lug'atdagi har bir raqam va hayvon uchun tuple yaratadi, lekin faqat lug'at kaliti uning qiymatiga teng bo'lganda yaratadi.

Quyidagi siklning muqobili:

>>> my_dict = {1: 'dog', 2: 'cat', 3: 'python'}
>>> my_list = []
>>> for num in my_dict:
... for animal in my_dict.values():
... if my_dict[num] == animal:
... my_list.append((num, animal))
>>> my_list
[(1, 'dog'), (2, 'cat'), (3, 'python')]

Filtr yo'qligida yuqoridagi ro'yxat quyidagicha bo'lardi:

[(1, 'dog'), (1, 'cat'), (1, 'python'), (2, 'dog'), (2, 'cat'), ...]

Siz oldingi ro'yxat komprehensiyasini biroz o'qilishi osonroq bo'lishi uchun shunday yozishingiz mumkin:

>>> my_dict = {1: 'dog', 2: 'cat', 3: 'python'}
>>> [(num, animal) for num in my_dict
... for animal in my_dict.values()
... if my_dict[num] == animal]
>>> [(1, 'dog'), (2, 'cat'), (3, 'python')]

Bu bitta satrdagi variantidan osonroq o'qiladi. Ro'yxat komprehensiyalari yozish juda qiziqarli, ammo ularni tuzatish yoki qayta tanishish qiyin bo'lishi mumkin. Har doim ro'yat komprehensiyalari ichidagi o'zgaruvchilarga yaxshi nomlar berishni unutmang. Agar komprehensiya juda murakkab bo'lsa, uni oddiy for sikliga ajratish yaxshiroq bo'ladi.

Ushbu sahifada

Xato haqida xabar berish