تابع داخلی پایتون ()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() عناصر از دست رفته را پر می کند.
با استفاده از zip_longest() در ماژول استاندارد itertools کتابخانه، زمانی که تعداد عناصر در هر لیست متفاوت است، می توان عناصر گمشده را با مقادیر دلخواه پر کرد.
به طور پیش فرض، با 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
اگر آرگومان fillvalue مشخص شده باشد، با آن مقدار پر می شود.
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
از نماد درک لیست و بسط لیست با * استفاده می کند.
- مقالات مرتبط:استفاده از نماد درک لیست پایتون
فهرستی از چند عنصر از چند تکرار را دریافت کنید.
تابع 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'>