آموزش استفاده از تابع Zip در زبان Python
۸ تیر ۱۴۰۰

وجود برخی توابع built-in در زبان Python کار شما را بهعنوان یک برنامهنویس سادهتر میکند. بههمین منظور تصمیم داریم در این مقاله شما را با نحوهی استفاده از تابع zip()
آشنا کنیم.
معرفی تابع Zip
مطمئنا قبل از کار کردن با تابع Zip باید درک درستی از عملکرد آن داشته باشید. این تابع با سینتکس:
zip(iterator1, iterator2, iterator3 ...)
چندین توالی قابل پیمایش مانند لیستها، دیکشنریها و رشتهها را بهعنوان آرگومانهای ورودی دریافت کرده و درنهایت یک آبجکت قابل پیمایش را return میکند. حال بیایید توضیحات تئوری را کنار گذاشته و یک مثال واقعی را برای درک بهتر عملکرد این تابع اجرا کنیم:
player_numbers = [7, 9, 10]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
player_data = zip(player_numbers, player_names)
print(list(player_data)) # Output: [(7, 'Cristiano Ronaldo'), (9, 'Gareth Bale'), (10, 'Lionel Messi')]
درمثال فوق، نام و شمارهی برخی از بازیکنان مشهور فوتبال را Zip کردهایم و همانطور که مشاهده میکنید، تابع Zip مانند یک زیپ فیزیکی عمل کرده است یعنی مقادیری با ایندکسهای مشابه در لیستهای player_numbers
و player_names
را در کنار هم قرار داده و درنهایت آنها را return میکند. البته باید توجه داشته باشید که برای دسترسی مستقیم به دادههای player_data
باید نوع آن را به لیست تبدیل کنید.

نحوهی استفاده از تابع Zip
حال پس از آشنا شدن با عملکرد تابع Zip میخواهیم به چگونگی و شرایط استفاده از آن بپردازیم.
هر تعداد توالی قابل پیمایش مورد نیاز خود را Zip کنید
همانطور که از سینتکس این تابع پیداست، شما میتوانید توالیهای مختلفی را بهعنوان آرگومان ورودی به تابع Zip پاس دهید. برای مثال بیایید سه لیست مختلف را Zip کنیم:
player_numbers = [7, 9, 10]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
teams = ['Juventus', 'Real Madrid', 'FC Barcelona']
player_data = zip(player_numbers, player_names, teams)
print(list(player_data)) # Output: [(7, 'Cristiano Ronaldo', 'Juventus'), (9, 'Gareth Bale', 'Real Madrid'), (10, 'Lionel Messi', 'FC Barcelona')]
ادعام لیستهایی با طول متفاوت با استفاده از تابع Zip
در نگاه اول ممکن است فکر کنید که توالیها باید از طول یکسانی برخوردار باشند اما در اصل نیازی به یکسان بودن طول توالیها نیست:
player_numbers = [7, 9]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
player_data = zip(player_numbers, player_names)
print(list(player_data)) # Output: [(7, 'Cristiano Ronaldo'), (9, 'Gareth Bale')]
همانطور که مشاهده میکنید، طول لیست ادغام شده برابر با کوتاهترین طول توالی آرگومانهای ورودی تابع Zip است و ایندکس سوم توالی player_names
نادیده گرفته شده است.

البته درصورتی که بخواهید هیچکدام از مقادیر توالیها نادیده گرفته نشود، میتوانید از تابع zip_longest()
بهشکل زیر استفاده کنید:
from itertools import zip_longest
player_numbers = [7, 9]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
player_data = zip_longest(player_numbers, player_names)
print(list(player_data)) # Output: [(7, 'Cristiano Ronaldo'), (9, 'Gareth Bale'), (None, 'Lionel Messi')]
توجه داشته باشید که برای استفاده از تابع zip_longest()
نیاز است آن را از ماژول Itertools
در کدهای خود import کرده باشید. اگر نگاهی به خروجیها بیندازید، این تابع مقدار None
را برای مقدار ناموجود در توالی player_numbers
قرار داده است اما شما میتوانید مقدار پیشفرض دیگری را بهصورت زیر تنظیم کنید:
player_data = zip_longest(player_numbers, player_names, fillvalue=0)
Unzip کردن با استفاده از تابع Zip

در زبان Python هیچ تابع built-in برای Unzip کردن وجود ندارد بنابراین ما قصد داریم از تابع Zip برای Unzip کردن توالیها استفاده کنیم. در این حالت از asterisk یا همان *
استفاده خواهیم کرد:
player_data = [(7, 'Cristiano Ronaldo'),
(9, 'Gareth Bale'),
(10, 'Lionel Messi')]
numbers, names = zip(*player_data)
print(numbers) # Output: (7, 9, 10)
print(names) # Output: ('Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi')
تبدیل دو لیست به یک دیکشنری با استفاده از تابع Zip
برای تبدیل دو لیست به یک دیکشنری مستقل با استفاده از تابع Zip در زبان Python دو راه حل وجود دارد که در مثال زیر میتوانید هر دو راه حل را مشاهده کنید:
player_numbers = [7, 9, 10]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
# Approach 1
player_data = {number: name for number,
name in zip(player_numbers, player_names)}
# --> {9: 'Gareth Bale', 10: 'Lionel Messi', 7: 'Cristiano Ronaldo'}
# Approach 2
player_data = dict(zip(player_numbers, player_names))
# --> {9: 'Gareth Bale', 10: 'Lionel Messi', 7: 'Cristiano Ronaldo'}
استفاده از تابع Zip در حلقههای For
اگر میخواهید چندین لیست را در حلقهی For مدیریت کنید، تابع Zip میتواند به شما کمک کند:
player_numbers = [7, 9, 10]
player_names = ['Cristiano Ronaldo', 'Gareth Bale', 'Lionel Messi']
teams = ['Juventus', 'Real Madrid', 'FC Barcelona']
player_data = zip(player_numbers, player_names, teams)
for number, name, team in zip(player_numbers, player_names, teams):
print(f"{name} represents {team} with a number of {number}")
# OUTPUT:
# Cristiano Ronaldo represents Juventus with a number of 7
# Gareth Bale represents Real Madrid with a number of 9
# Lionel Messi represents FC Barcelona with a number of 10
منبع: https://betterprogramming.pub/7-useful-ways-to-use-the-zip-function-in-python-2b936414805e
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
![liara testimonial]()
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
![liara testimonial]()
jadi
با قدرت میتونم بگم تیم پشتیانی لیاراliara_cloud@یکی از بهترین تیمهای پشتیبانی که تا حالا دیدم. کارشون ارائه سرویسهای PaaS هست ولی من سوال در سطح برنامه خودمم(نه زیرساخت پلتفرم) که میپرسم بازم کامل و به موقع راهنمایی میکنن.
Amir
![liara testimonial]()
amirmazinani_ir
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
![liara testimonial]()
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
![liara testimonial]()
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
![liara testimonial]()
vanenshi