Python-un daxili funksiyası zip() çoxlu təkrarlana bilən obyektlərin elementlərini (siyahılar, dəstlər və s.) birləşdirir və for döngəsində çoxsaylı siyahıların elementlərini əldə etmək üçün istifadə olunur.
Bu bölmə zip() funksiyasının aşağıdakı istifadəsini təsvir edir.
- Çoxlu siyahıların elementlərini for döngəsində əldə edin.
- Müxtəlif sayda elementlərlə işləmək
zip()
:Funksiya həddindən artıq olan elementlərə məhəl qoymayacaq.itertools.zip_longest()
:Bu funksiya çatışmayan elementləri dolduracaq.
- Çox iterativ elementlərin dəstlərinin siyahısını əldə edin.
Çoxlu siyahıların elementlərini for döngəsində əldə edin.
Əgər siz birdən çox təkrarlana bilən obyektlərin elementlərini (siyahılar, dəstlər və s.) eyni vaxtda for döngəsində əldə etmək və istifadə etmək istəyirsinizsə, onları zip() funksiyasına arqumentlər kimi daxil edin.
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Yalnız iki deyil, üç və ya daha çox.
points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90
Müxtəlif sayda elementlərlə işləmək
zip() funksiyası çoxlu sayda elementə məhəl qoymur.
Zip() funksiyasında hər siyahıdakı elementlərin sayı fərqli olarsa, elementlərin daha az (qısa) sayı qaytarılacaq, daha çox olan isə nəzərə alınmayacaq.
names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
itertools.zip_longest() funksiyası çatışmayan elementləri dolduracaq.
Standart kitabxana itertools modulunda zip_longest() funksiyasından istifadə edərək, hər siyahıdakı elementlərin sayı fərqli olduqda çatışmayan elementləri ixtiyari qiymətlərlə doldurmaq mümkündür.
Varsayılan olaraq, heç biri ilə doldurulur.
from itertools import zip_longest names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip_longest(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave None
Doldurma dəyəri arqumenti göstərilibsə, o, həmin dəyərlə doldurulacaq.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Çatışmayan elementləri olan bir neçə siyahı olsa belə, doldurulacaq dəyər vahiddir. Fərqli dəyərləri müəyyən etmək mümkün deyil.
points = [100, 85] for name, age, point in zip_longest(names, ages, points, fillvalue=20): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 20 # Dave 20 20
zip_longest() daxilində zip_longest() funksiyasından istifadə etməklə fərqli dəyər təyin etmək mümkündür, lakin bu praktiki deyil, çünki siyahının hansı elementlərinin çatışmadığını əvvəlcədən bilmək lazımdır.
Əgər siz çoxlu siyahıları naməlum sayda elementlərlə doldurmaq istəyirsinizsə, hər biri fərqli dəyərə malikdir, aşağıdakı prosedur nəzərdən keçirilə bilər.
- Bütün siyahılar üçün doldurulacaq dəyərləri müəyyənləşdirin.
- Elementlərin maksimum sayını əldə edin
- Bütün siyahıları elementlərin maksimum sayına qədər doldurun
- zip() funksiyasından istifadə etməklə
fill_name = 'XXX' fill_age = 20 fill_point = 50 len_names = len(names) len_ages = len(ages) len_points = len(points) max_len = max(len_names, len_ages, len_points) names = names + [fill_name] * (max_len - len_names) ages = ages + [fill_age] * (max_len - len_ages) points = points + [fill_point] * (max_len - len_points) print(names) print(ages) print(points) # ['Alice', 'Bob', 'Charlie', 'Dave'] # [24, 50, 18, 20] # [100, 85, 50, 50] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
Ən çox sayda elementi doldurma prosesində aşağıdakıları edirik.
- İxtiyari dəyər və elementlərin sayı ilə siyahının işə salınması
- + siyahıları birləşdirmək üçün operator
Bunu funksiyaya çevirsək, belə görünür. Orijinal siyahı və siyahını dolduran dəyərlər müvafiq olaraq təkrarlana bilən arqumentlər (siyahı və ya tuple) kimi müəyyən edilir.
def my_zip_longest(iterables, fillvalues): max_len = max(len(i) for i in iterables) return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)]) for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
Bu siyahı başa düşmə notasiyasından və * ilə siyahı genişləndirilməsindən istifadə edir.
- Əlaqədar Məqalələr:Python siyahısı başa düşmə notasiyasından istifadə
Çox iterativ elementlərin dəstlərinin siyahısını əldə edin.
zip() funksiyası çoxlu təkrarlana bilən obyektlərin elementləri silsiləsi olan iteratoru (zip obyekti) qaytarır.
O, həmçinin for döngəsindən kənarda istifadə edilə bilər və hədəf siyahılarla məhdudlaşmır.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Bir dəst kimi çoxlu təkrarlana bilən obyektlərin elementlərinin siyahısını əldə etmək istəyirsinizsə, siyahı yaratmaq üçün list() istifadə edin.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>