Python-ның кірістірілген функциясы zip() бірнеше қайталанатын нысандардың элементтерін (тізімдер, кортеждер, т.б.) біріктіреді және for цикліндегі бірнеше тізімдердің элементтерін шығарып алу үшін қолданылады.
Бұл бөлім zip() функциясының келесі қолданылуын сипаттайды.
- For циклінде бірнеше тізімнің элементтерін алыңыз.
- Әртүрлі элементтер санымен жұмыс істеу
zip()
:Функция тым көп элементтерді елемейді.itertools.zip_longest()
:Бұл функция жетіспейтін элементтерді толтырады.
- Бірнеше қайталанатын элементтердің кортеждерінің тізімін алыңыз.
For циклінде бірнеше тізімнің элементтерін алыңыз.
Бірнеше қайталанатын нысандардың (тізімдер, кортеждер, т.б.) элементтерін бір уақытта for циклінде шығарып алып, пайдаланғыңыз келсе, оларды zip() функциясына аргумент ретінде көрсетіңіз.
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Екі ғана емес, үш немесе одан да көп.
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
Әртүрлі элементтер санымен жұмыс істеу
zip() функциясы көптеген элементтерді елемейді.
zip() функциясында әрбір тізімдегі элементтер саны әртүрлі болса, элементтердің аз (қысқа) санына дейін қайтарылады, ал үлкен саны еленбейді.
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() функциясы жетіспейтін элементтерді толтырады.
Стандартты кітапхананың itertools модулінде zip_longest() функциясын пайдаланып, әрбір тізімдегі элементтердің саны әртүрлі болған кезде жетіспейтін элементтерді ерікті мәндермен толтыруға болады.
Әдепкі бойынша ол None толтырылады.
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
Егер толтыру мәні аргументі көрсетілсе, ол сол мәнмен толтырылады.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Жетіспейтін элементтері бар бірнеше тізім болса да, толтырылатын мән біркелкі болады. Әртүрлі мәндерді көрсету мүмкін емес.
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() ішінде zip_longest() пайдалану арқылы басқа мәнді көрсетуге болады, бірақ бұл практикалық емес, себебі тізімнің қай элементтері жоқ екенін алдын ала білуіңіз керек.
Әрқайсысының мәні әртүрлі элементтер саны белгісіз бірнеше тізімдерді толтырғыңыз келсе, келесі процедураны қарастыруға болады.
- Барлық тізімдер үшін толтырылатын мәндерді анықтаңыз.
- Элементтердің максималды санын алыңыз
- Барлық тізімдерді элементтердің максималды санына дейін толтырыңыз
- zip() функциясын пайдалану
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
Элементтердің ең көп санына дейін толтыру процесінде біз келесі әрекеттерді орындаймыз.
- Тізімді еркін мәнмен және элементтер санымен инициализациялау
- + тізімдерді біріктіру үшін оператор
Егер біз мұны функцияға айналдырсақ, ол келесідей болады. Түпнұсқа тізім және тізімді толтыратын мәндер сәйкесінше қайталанатын аргументтер (тізім немесе кортеж) ретінде көрсетіледі.
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
Ол тізімді түсіну белгісін және * арқылы тізімді кеңейтуді пайдаланады.
- Қатысты мақалалар:Python тізімін түсіну белгілерін пайдалану
Бірнеше қайталанатын элементтердің кортеждерінің тізімін алыңыз.
zip() функциясы бірнеше қайталанатын нысандардың элементтерінің кортежі болып табылатын итераторды (zip нысаны) қайтарады.
Оны for циклінің сыртында да қолдануға болады және мақсат тізімдермен шектелмейді.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Кортеж ретінде бірнеше қайталанатын нысандардың элементтерінің тізімін алғыңыз келсе, тізім жасау үшін list() пайдаланыңыз.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>