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

برچسب‌ها:

خدمات رایگان لیارا

۲.۵ گیگابایت فضای ذخیره‌سازی ابری رایگان

۲.۵ گیگابایت Object Storage سازگار با پروتکل S3 با دیسک‌های SSD به‌صورت رایگان دریافت کنید.

هاست رایگان برای دیتابیس‌

دیتابیس‌های MariaDB، PostgreSQL و Redis را فقط با یک کلیک و به‌صورت رایگان تهیه کنید.

سرویس DNS رایگان

به سادگی دامنه‌تان را اضافه کنید و به صورت رایگان رکورد‌های آن را مدیریت کنید.

۱۰۰ هزار تومان اعتبار اولیه

بعد از ثبت نام در لیارا مبلغ ۱۰۰ هزار تومان اعتبار هدیه دریافت می‌کنید که با توجه به ساعتی بودن هزینه سرویس‌ها، می‌توانید تمامی خدمات پولی را برای چندین هفته رایگان استفاده کنید.

ارسال ۱۰۰ ایمیل تراکنشی رایگان در هر ماه

در سرویس ایمیل لیارا شما می‌توانید تا ۱۰۰ ایمیل رایگان در هر ماه ارسال کنید و فقط برای بیش از آن هزینه پرداخت کنید. (به‌همراه دسترسی SMTP)

هاست رایگان برای انواع وبسایت

تفاوتی ندارد برای وبسایت خود از Node استفاده می‌کنید یا Laravel و Django، در لیارا می‌توانید به صورت کاملا رایگان آن را میزبانی کنید.

توسعه‌دهندگان درباره‌ی ما چه می‌گویند

تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...

MohammadReza
liara testimonial
keikaavousi

بعد از بسته شدن @fandoghpaas و ناراحتی همه‌مون از اینکه یه سرویس خوب و صادق نمی‌تونه از پس هزینه‌ها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوت‌هایی داشت که کمی کار می‌خواست ولی تا الان کاملا راضی.

jadi
liara testimonial
jadi

یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.

Arch
liara testimonial
EbadiDev

واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیت‌های سرویس دیتابیس‌شون اینه که خودشون به صورت دوره‌ای بکآپ میگیرن.
...

Ali Najafi
liara testimonial
me_ali_najafi

یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@

Navid
liara testimonial
1navid

عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم

Amir H Shekari
liara testimonial
vanenshi

همراه شما هستیم

در خصوص سفارش یا استفاده از سرویس‌ها سوالی دارید؟
تلفن واحد فروش:
۰۲۵-۳۳۵۵۷۶۱۹ (روزهای کاری ۹ الی ۱۷)
تلفن واحد فروش: ۳۳۵۵۷۶۱۹-۰۲۵ (روزهای کاری ۹ الی ۱۷)