شرح دالة zip في Python لدمج القوائم خطوة بخطوة للمبتدئين

شرح دالة zip في Python لدمج القوائم خطوة بخطوة للمبتدئين

{getToc} $title={محتوى المقال}

تُعد دالة zip() في Python من الدوال المفيدة جدًا عندما تريد التعامل مع أكثر من قائمة في نفس الوقت. فبدلًا من كتابة كود طويل للوصول إلى عناصر قائمتين أو أكثر باستخدام الفهرس، تساعدك zip() على ربط العناصر المتقابلة معًا بطريقة سهلة وواضحة.

في هذا الدرس من بايثون العرب سنشرح دالة zip خطوة بخطوة، ونرى كيف نستخدمها مع القوائم، وكيف نحول نتيجتها إلى list أو dict، وما الأخطاء الشائعة التي يقع فيها المبتدئون عند استخدامها.

الفكرة المختصرة: دالة zip() تجمع العنصر الأول من كل قائمة معًا، ثم العنصر الثاني من كل قائمة معًا، وهكذا. {alertInfo}

ما هي دالة zip في Python؟

دالة zip() هي دالة جاهزة في Python تُستخدم لدمج أكثر من كائن قابل للتكرار، مثل القوائم Lists أو النصوص Strings أو الصفوف Tuples.

عندما تمرر قائمتين إلى zip() فإنها لا تدمجهما كقائمة واحدة، بل تربط العناصر المتقابلة معًا على شكل أزواج.

names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]

result = zip(names, scores)

print(list(result))

الناتج:

[('Ali', 90), ('Sara', 85), ('Omar', 77)]

لاحظ أن zip() جمعت كل اسم مع الدرجة المقابلة له.


شرح فكرة دالة zip في Python وكيف تربط عناصر قائمتين حسب الترتيب

لماذا نستخدم zip بدل التكرار بالفهرس؟

قبل أن تعرف zip() قد تكتب كودًا يعتمد على الفهرس للوصول إلى عنصر من القائمة الأولى وعنصر من القائمة الثانية.

names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]

for i in range(len(names)):
    print(names[i], scores[i])

الكود يعمل، لكنه أطول ويحتاج إلى فهم الفهارس جيدًا. باستخدام zip() يصبح الكود أوضح:

names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]

for name, score in zip(names, scores):
    print(name, score)

هذا الأسلوب أسهل للقراءة، وأقرب إلى التفكير الطبيعي: لكل اسم، خذ الدرجة المقابلة له.

نصيحة مهمة: عندما تريد المرور على قائمتين في نفس الوقت، غالبًا ستكون zip() أوضح من استخدام range(len()). {alertSuccess}

مثال عملي: عرض أسماء الطلاب ودرجاتهم

لنفترض أن لديك قائمة بأسماء الطلاب وقائمة أخرى بدرجاتهم، وتريد طباعة كل طالب مع درجته.

students = ["أحمد", "ليلى", "مريم"]
grades = [95, 88, 91]

for student, grade in zip(students, grades):
    print(student, "حصل على", grade)

الناتج:

أحمد حصل على 95
ليلى حصل على 88
مريم حصل على 91

هذا المثال مفيد جدًا في التطبيقات التعليمية، الجداول، معالجة البيانات، والتقارير البسيطة.


مثال دمج قائمتين في Python باستخدام zip للحصول على الاسم مع الدرجة

تحويل نتيجة zip إلى list

من الأشياء التي تربك المبتدئين أن طباعة zip() مباشرة لا تعرض العناصر بالشكل المتوقع.

a = [1, 2, 3]
b = ["A", "B", "C"]

print(zip(a, b))

قد يظهر لك شيء شبيه بهذا:

<zip object at 0x...>

هذا ليس خطأ. السبب أن zip() تُرجع كائنًا قابلًا للتكرار، وليس قائمة جاهزة مباشرة. إذا أردت رؤية النتيجة كقائمة، استخدم list().

a = [1, 2, 3]
b = ["A", "B", "C"]

result = list(zip(a, b))
print(result)

الناتج:

[(1, 'A'), (2, 'B'), (3, 'C')]

تحويل قائمتين إلى Dictionary باستخدام zip

من أشهر استخدامات zip() في Python تحويل قائمتين إلى قاموس Dictionary. القائمة الأولى تكون المفاتيح، والقائمة الثانية تكون القيم.

keys = ["name", "age", "city"]
values = ["Ali", 20, "Sanaa"]

user = dict(zip(keys, values))

print(user)

الناتج:

{'name': 'Ali', 'age': 20, 'city': 'Sanaa'}

هذا المثال مهم جدًا؛ لأن القواميس تُستخدم كثيرًا في بايثون عند تنظيم البيانات. إذا لم تكن مرتاحًا مع القواميس بعد، يمكنك مراجعة درس: شرح القواميس Dictionaries في Python للمبتدئين.


شرح استخدام zip مع for loop في Python للمرور على أكثر من قائمة

استخدام zip مع أكثر من قائمتين

يمكنك استخدام zip() مع أكثر من قائمتين. مثلًا: قائمة أسماء، وقائمة أعمار، وقائمة مدن.

names = ["Ali", "Sara", "Omar"]
ages = [20, 22, 19]
cities = ["Sanaa", "Amman", "Cairo"]

for name, age, city in zip(names, ages, cities):
    print(name, age, city)

الناتج:

Ali 20 Sanaa
Sara 22 Amman
Omar 19 Cairo

كل دورة في الحلقة تأخذ عنصرًا من كل قائمة بالترتيب نفسه.

ماذا يحدث إذا كانت القوائم بأطوال مختلفة؟

إذا كانت القوائم غير متساوية في عدد العناصر، فإن zip() تتوقف عند أقصر قائمة.

names = ["Ali", "Sara", "Omar"]
scores = [90, 85]

for name, score in zip(names, scores):
    print(name, score)

الناتج:

Ali 90
Sara 85

لاحظ أن Omar لم يظهر؛ لأن قائمة الدرجات تحتوي على عنصرين فقط.

تنبيه: إذا كانت القوائم عندك بأطوال مختلفة، تأكد أن هذا السلوك مناسب لك قبل استخدام zip(). {alertWarning}

متى أستخدم zip في Python؟

استخدم zip() عندما تكون لديك بيانات مترابطة في أكثر من قائمة، وتريد التعامل مع العناصر المتقابلة معًا.

الحالة هل zip مناسبة؟ مثال
قائمة أسماء وقائمة درجات نعم ربط كل طالب بدرجته
قائمة مفاتيح وقائمة قيم نعم إنشاء Dictionary
تكرار على قائمة واحدة فقط ليست ضرورية استخدم for loop عادية
تحتاج رقم الفهرس مع القيمة ربما لا استخدم enumerate

إذا كنت تريد رقم الفهرس أثناء التكرار، فالأفضل غالبًا استخدام enumerate(). يمكنك قراءة درس: شرح دالة enumerate في Python ولماذا تسهّل التعامل مع القوائم.

الفرق بين zip و enumerate

قد يخلط بعض المبتدئين بين zip() و enumerate(). الفرق بسيط:

  • zip() تُستخدم للمرور على أكثر من قائمة في نفس الوقت.
  • enumerate() تُستخدم للحصول على الفهرس والقيمة من قائمة واحدة.
names = ["Ali", "Sara", "Omar"]

for index, name in enumerate(names):
    print(index, name)

أما إذا كانت لديك قائمتان:

names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]

for name, score in zip(names, scores):
    print(name, score)

أخطاء شائعة عند استخدام zip

1. نسيان تحويل النتيجة إلى list

إذا كتبت:

print(zip([1, 2], ["A", "B"]))

فلن ترى العناصر مباشرة. استخدم:

print(list(zip([1, 2], ["A", "B"])))

2. عدم الانتباه لاختلاف طول القوائم

دالة zip() تتوقف عند أقصر قائمة، لذلك قد تفقد بعض العناصر إذا لم تكن منتبهًا.

3. استخدام zip في حالة لا تحتاجها

إذا كنت تتعامل مع قائمة واحدة فقط، لا تحتاج zip(). استخدم حلقة for عادية.


ملخص استخدامات دالة zip في Python مع القوائم والقواميس وتحويل النتائج

تمرين بسيط على دالة zip

جرّب كتابة برنامج يحتوي على قائمتين:

  • قائمة أسماء المنتجات.
  • قائمة أسعار المنتجات.

ثم استخدم zip() لطباعة كل منتج مع سعره.

مثال متوقع للناتج:

Keyboard : 25
Mouse : 10
Monitor : 120

الحل المقترح:

products = ["Keyboard", "Mouse", "Monitor"]
prices = [25, 10, 120]

for product, price in zip(products, prices):
    print(product, ":", price)

روابط مفيدة لتعلم المزيد

إذا كنت تريد تقوية فهمك قبل استخدام zip() بكثرة، أنصحك بمراجعة هذه الدروس من بايثون العرب:

وللاطلاع على الشرح الرسمي، يمكنك زيارة: توثيق Python الرسمي لدالة zip. وإذا أردت التعامل مع القوائم غير المتساوية في الطول، يمكنك قراءة: توثيق itertools.zip_longest.

الخلاصة

دالة zip() من الدوال البسيطة والمهمة في Python، وتفيدك عندما تريد دمج عناصر متقابلة من قائمتين أو أكثر. استخدامها يجعل الكود أوضح من الاعتماد على الفهارس، خصوصًا في الأمثلة التي تحتوي على أسماء ودرجات، مفاتيح وقيم، منتجات وأسعار، أو أي بيانات مترابطة.

تذكّر أن zip() تُرجع كائنًا قابلًا للتكرار، لذلك قد تحتاج إلى تحويل النتيجة إلى list أو dict حسب حاجتك. وتذكّر أيضًا أنها تتوقف عند أقصر قائمة إذا كانت القوائم غير متساوية في الطول.

أسئلة شائعة مع إجاباتها

ما فائدة zip في Python؟

تُستخدم zip() لدمج العناصر المتقابلة من أكثر من قائمة أو كائن قابل للتكرار، مما يجعل التكرار على البيانات المرتبطة أسهل وأوضح.

هل zip ترجع List مباشرة؟

لا. دالة zip() ترجع كائنًا قابلًا للتكرار. إذا أردت عرض النتيجة كقائمة، استخدم list(zip(...)).

ماذا يحدث إذا كانت القوائم مختلفة الطول؟

تتوقف zip() عند أقصر قائمة، ولا تكمل مع العناصر الزائدة في القوائم الأطول.

هل يمكن تحويل zip إلى Dictionary؟

نعم. إذا كانت لديك قائمة مفاتيح وقائمة قيم، يمكنك استخدام dict(zip(keys, values)) لإنشاء قاموس بسهولة.

ما الفرق بين zip و enumerate؟

zip() تُستخدم للتكرار على أكثر من قائمة معًا، أما enumerate() فتُستخدم للحصول على الفهرس والقيمة من قائمة واحدة.

إرسال تعليق

أحدث أقدم