برنامه‌نویسی

آموزش استفاده از تابع Zip در زبان Python

آموزش استفاده از تابع 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 پاس دهید. برای مثال بیایید سه لیست مختلف را 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 کردن دو لیست با طول‌های متفاوت

البته درصورتی که بخواهید هیچکدام از مقادیر توالی‌ها نادیده گرفته نشود، می‌توانید از تابع 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

unzip کردن یک لیست

در زبان 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