آموزش استفاده از تابع 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