Python-da yeni siyahı yaradan zaman siyahı başa düşmə notasiyasından istifadə etmək asandır.(List comprehensions
)
- 5. Data Structures — List Comprehensions — Python 3.10.0 Documentation
- 6. Expressions — Displays for lists, sets and dictionaries — Python 3.10.0 Documentation
Bu yazıda əvvəlcə aşağıdakıları müzakirə edəcəyik
- Siyahının başa düşülməsi qeydinin əsas növü
- Şərti budaqlanma ilə başa düşmə notasiyasını if
- Üçlü operatorlarla birləşmə (əgər başqa cür emal varsa)
zip()
,enumerate()
Bunlarla birləşmə- iç içə siyahıya daxil edilmə qeydi
Sonra, biz nümunə kodu ilə siyahı başa düşmə notasiya dəstini izah edəcəyik.
- daxil qeydini təyin edin(
Set comprehensions
) - lüğət daxil notasiyası(
Dict comprehensions
) - generator növü(
Generator expressions
)
- Siyahının başa düşülməsi qeydinin əsas növü
- Şərti budaqlanma ilə başa düşmə notasiyasını if
- Üçlü operatorlarla birləşmə (əgər başqa cür emal varsa)
- zip() və enumerate() ilə birləşmə
- iç içə siyahıya daxil edilmə qeydi
- daxil qeydini təyin edin(Set comprehensions)
- lüğət daxil notasiyası(Dict comprehensions)
- generator növü(Generator expressions)
Siyahının başa düşülməsi qeydinin əsas növü
Siyahının başa düşülməsi qeydi aşağıdakı kimi yazılır.
[Expression for Any Variable Name in Iterable Object]
O, təkrarlana bilən obyektin hər bir elementini, məsələn, siyahı, dəst və ya diapazonu ixtiyari dəyişən adı ilə götürür və onu ifadə ilə qiymətləndirir. Element kimi qiymətləndirmə nəticəsi olan yeni siyahı qaytarılır.
Nümunə ifadə üçün ekvivalentlə birlikdə verilir.
squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]
squares = []
for i in range(5):
squares.append(i**2)
print(squares)
# [0, 1, 4, 9, 16]
Eyni proses map() ilə edilə bilər, lakin siyahının başa düşülməsi qeydinə sadəliyi və aydınlığı üçün üstünlük verilir.
Şərti budaqlanma ilə başa düşmə notasiyasını if
Əgər mümkündürsə ilə şərti budaqlanma. Postfiksdə if-i aşağıdakı kimi yazın.
[Expression for Any Variable Name in Iterable Object if Conditional Expression]
Yalnız təkrarlana bilən obyektin şərti ifadəsi doğru olan elementləri ifadə ilə qiymətləndirilir və elementləri nəticə olan yeni siyahı qaytarılır.
Şərti ifadədə istənilən dəyişən adından istifadə edə bilərsiniz.
Nümunə ifadə üçün ekvivalentlə birlikdə verilir.
odds = [i for i in range(10) if i % 2 == 1]
print(odds)
# [1, 3, 5, 7, 9]
odds = []
for i in range(10):
if i % 2 == 1:
odds.append(i)
print(odds)
# [1, 3, 5, 7, 9]
Eyni prosesi filter() ilə də etmək olar, lakin siyahının başa düşülməsi qeydinə sadəliyi və aydınlığı üçün üstünlük verilir.
Üçlü operatorlarla birləşmə (əgər başqa cür emal varsa)
Yuxarıdakı nümunədə yalnız meyarlara cavab verən elementlər işlənir, meyarlara uyğun gəlməyənlər isə yeni siyahıdan çıxarılır.
Şərtdən asılı olaraq prosesi dəyişdirmək istəyirsinizsə və ya şərti təmin etməyən elementləri başqa cür emal etmək istəyirsinizsə, başqa halda olduğu kimi, üçlü operatordan istifadə edin.
Python-da üçlü operatoru aşağıdakı kimi yazmaq olar
Value When True if Conditional Expression else Value When False
Bu, aşağıda göstərildiyi kimi siyahının başa düşülməsi qeydinin ifadə hissəsində istifadə olunur.
[Value When True if Conditional Expression else Value When False for Any Variable Name in Iterable Object]
Nümunə ifadə üçün ekvivalentlə birlikdə verilir.
odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
odd_even = []
for i in range(10):
if i % 2 == 1:
odd_even.append('odd')
else:
odd_even.append('even')
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
Doğru və yanlış qiymətlər üçün ixtiyari dəyişən adlarından istifadə edərək ifadələr yazmaq da mümkündür.
Şərt yerinə yetirilərsə, bəzi emal aparılır, əks halda orijinal təkrarlana bilən obyektin dəyəri dəyişməz qalır.
odd10 = [i * 10 if i % 2 == 1 else i for i in range(10)]
print(odd10)
# [0, 10, 2, 30, 4, 50, 6, 70, 8, 90]
zip() və enumerate() ilə birləşmə
For ifadəsində tez-tez istifadə olunan faydalı funksiyalara çoxlu təkrarlananları birləşdirən zip() və indeksi ilə birlikdə dəyəri qaytaran enumerate() daxildir.
Təbii ki, siyahı başa düşmə notasiyası ilə zip() və enumerate() funksiyalarından istifadə etmək mümkündür. Bu, xüsusi sintaksis deyil və for ifadəsi ilə yazışmaları nəzərə alsanız, çətin deyil.
zip() nümunəsi.
l_str1 = ['a', 'b', 'c']
l_str2 = ['x', 'y', 'z']
l_zip = [(s1, s2) for s1, s2 in zip(l_str1, l_str2)]
print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]
l_zip = []
for s1, s2 in zip(l_str1, l_str2):
l_zip.append((s1, s2))
print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]
Enumerate() nümunəsi.
l_enu = [(i, s) for i, s in enumerate(l_str1)]
print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]
l_enu = []
for i, s in enumerate(l_str1):
l_enu.append((i, s))
print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]
İdeya if istifadə edərkən əvvəlki kimidir.
l_zip_if = [(s1, s2) for s1, s2 in zip(l_str1, l_str2) if s1 != 'b']
print(l_zip_if)
# [('a', 'x'), ('c', 'z')]
Hər bir element yeni elementi hesablamaq üçün də istifadə edilə bilər.
l_int1 = [1, 2, 3]
l_int2 = [10, 20, 30]
l_sub = [i2 - i1 for i1, i2 in zip(l_int1, l_int2)]
print(l_sub)
# [9, 18, 27]
iç içə siyahıya daxil edilmə qeydi
Döngələr üçün yuva kimi, siyahının başa düşülməsi qeydi də yuvalana bilər.
[Expression for Variable Name 1 in Iterable Object 1
for Variable Name 2 in Iterable Object 2
for Variable Name 3 in Iterable Object 3 ... ]
Rahatlıq üçün sətir sonları və girintilər əlavə edilmişdir, lakin qrammatika üçün tələb olunmur; onları bir sətirdə davam etdirmək olar.
Nümunə ifadə üçün ekvivalentlə birlikdə verilir.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
flat = []
for row in matrix:
for x in row:
flat.append(x)
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
Çox dəyişənlərdən istifadə etmək də mümkündür.
cells = [(row, col) for row in range(3) for col in range(2)]
print(cells)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
Şərti budaqlama da edə bilərsiniz.
cells = [(row, col) for row in range(3)
for col in range(2) if col == row]
print(cells)
# [(0, 0), (1, 1)]
Hər bir təkrarlana bilən obyekt üçün şərti budaqlanma da mümkündür.
cells = [(row, col) for row in range(3) if row % 2 == 0
for col in range(2) if col % 2 == 0]
print(cells)
# [(0, 0), (2, 0)]
daxil qeydini təyin edin(Set comprehensions)
Siyahının başa düşülməsi qeydində kvadrat mötərizələrin [] əyri mötərizələrə {} dəyişdirilməsi çoxluq (dəst tipli obyekt) yaradır.
{Expression for Any Variable Name in Iterable Object}
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
lüğət daxil notasiyası(Dict comprehensions)
Lüğətlər (dict tipli obyektlər) anlama notasiyası ilə də yaradıla bilər.
{} və ifadə hissəsində açar və dəyəri açar olaraq təyin edin: dəyər.
{Key: Value for Any Variable Name in Iterable Object}
Açar və dəyər üçün istənilən ifadə təyin oluna bilər.
l = ['Alice', 'Bob', 'Charlie']
d = {s: len(s) for s in l}
print(d)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}
Düymələr və dəyərlər siyahısından yeni lüğət yaratmaq üçün zip() funksiyasından istifadə edin.
keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]
d = {k: v for k, v in zip(keys, values)}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}
generator növü(Generator expressions)
Əgər siyahının başa düşülməsi qeydində kvadrat mötərizələr [] dairəvi mötərizə () kimi istifadə olunursa, dəzgah əvəzinə generator qaytarılır. Buna generator ifadələri deyilir.
Siyahının başa düşülməsi qeydinin nümunəsi.
l = [i**2 for i in range(5)]
print(l)
# [0, 1, 4, 9, 16]
print(type(l))
# <class 'list'>
Generator ifadəsinin nümunəsi. Generatoru olduğu kimi çap etsəniz, o, məzmununu çap etməyəcək, lakin onu for ifadəsi ilə işlətsəniz, məzmunu əldə edə bilərsiniz.
g = (i**2 for i in range(5))
print(g)
# <generator object <genexpr> at 0x10af944f8>
print(type(g))
# <class 'generator'>
for i in g:
print(i)
# 0
# 1
# 4
# 9
# 16
Generator ifadələri həmçinin if, həmçinin siyahı başa düşmə notasiyasından istifadə edərək şərti budaqlanma və yuva qurmağa imkan verir.
g_cells = ((row, col) for row in range(0, 3)
for col in range(0, 2) if col == row)
print(type(g_cells))
# <class 'generator'>
for i in g_cells:
print(i)
# (0, 0)
# (1, 1)
Məsələn, çox sayda elementdən ibarət siyahı siyahının başa düşülməsi qeydindən istifadə edilərək yaradılırsa və sonra for ifadəsi ilə dövrələnirsə, siyahı başa düşmə notasiyası istifadə edilərsə, bütün elementləri ehtiva edən siyahı əvvəlində yaradılacaq. Digər tərəfdən, generator ifadəsindən istifadə etsəniz, hər dəfə dövrə təkrarlananda elementlər bir-bir yaradılır və beləliklə, istifadə olunan yaddaşın həcmi azalır.
Generator ifadəsi funksiyanın yeganə arqumentidirsə, dairəvi mötərizələr () buraxıla bilər.
print(sum([i**2 for i in range(5)]))
# 30
print(sum((i**2 for i in range(5))))
# 30
print(sum(i**2 for i in range(5)))
# 30
Emal sürətinə gəlincə, bütün elementlər işləndikdə siyahı başa düşmə notasiyası çox vaxt generator qeydindən daha sürətli olur.
Bununla belə, all() və ya any() ilə mühakimə edərkən nəticə yalan və ya doğru olduqda müəyyən edilir, ona görə də generator ifadələrindən istifadə siyahının başa düşülməsi qeydindən daha sürətli ola bilər.
Tuple başa düşmə notasiyası yoxdur, lakin siz tuple() arqumenti kimi generator ifadəsindən istifadə etsəniz, başa düşmə notasiyasında bir dəst yarada bilərsiniz.
t = tuple(i**2 for i in range(5))
print(t)
# (0, 1, 4, 9, 16)
print(type(t))
# <class 'tuple'>