إذا كانت لديك قائمتان وتريد ربط العنصر الأول من الأولى بالعنصر الأول من الثانية، ثم الثاني بالثاني وهكذا، فاستخدم zip().
names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]
for name, score in zip(names, scores):
print(name, score)
الناتج:
Ali 90
Sara 85
Omar 77
هذا هو الدرس 23 من سلسلة بايثون بالمثال. هدفه تطبيق فكرة واحدة بوضوح: المرور على قائمتين مترابطتين عنصرًا بعنصر.
{alertInfo} الفكرة: الاسم الأول يقترن بالدرجة الأولى، والاسم الثاني بالدرجة الثانية، والثالث بالثالث.
{getToc} $title={محتوى المقال}
كيف تربط قائمتين عنصرًا بعنصر باستخدام zip()؟
لدينا قائمتان:
names = ["Ali", "Sara", "Omar"]
scores = [90, 85, 77]
عند استخدام zip() نحصل منطقيًا على الأزواج التالية:
("Ali", 90)("Sara", 85)("Omar", 77)
إذا أردت رؤية الأزواج داخل List:
result = list(zip(names, scores))
print(result)
الناتج:
[('Ali', 90), ('Sara', 85), ('Omar', 77)]
لماذا zip أوضح من range(len()) هنا؟
يمكنك استخدام الفهرس:
for i in range(len(names)):
print(names[i], scores[i])
الكود صحيح، لكن عندما تكون القائمتان مترابطتين حسب الموضع، تكون zip() أوضح:
for name, score in zip(names, scores):
print(name, score)
لا نقول إن range(len()) خطأ دائمًا؛ إذا كنت تحتاج الفهرس نفسه فقد يكون مناسبًا.
zip() لا تعني جمع القائمتين وراء بعض
a = [1, 2]
b = ["A", "B"]
print(list(zip(a, b)))
الناتج:
[(1, 'A'), (2, 'B')]
النتيجة أزواج وليست [1, 2, "A", "B"]. إذا كان هدفك جمع عناصر القائمتين في List واحدة، راجع الفرق بين append وextend.
ماذا يحدث إذا كان طول القائمتين مختلفًا؟
names = ["Ali", "Sara", "Omar"]
scores = [90, 85]
for name, score in zip(names, scores):
print(name, score)
الناتج:
Ali 90
Sara 85
zip() العادية تتوقف عند أقصر Iterable، لذلك لم يظهر Omar.
كيف أكتشف اختلاف الأطوال بدل تجاهله؟
في Python 3.10 وما بعده استخدم strict=True عندما يفترض البرنامج أن القائمتين متساويتان:
names = ["Ali", "Sara", "Omar"]
scores = [90, 85]
result = list(
zip(
names,
scores,
strict=True
)
)
بسبب اختلاف الأطوال ستظهر ValueError بدل التوقف عند الأقصر بصمت.
مثال عملي: المنتجات والأسعار
products = ["Keyboard", "Mouse", "Monitor"]
prices = [25, 10, 120]
for product, price in zip(products, prices):
print(f"{product}: ${price}")
الناتج:
Keyboard: $25
Mouse: $10
Monitor: $120
تمرين قصير
أنشئ قائمتين: الأولى أسماء مواد دراسية، والثانية الدرجات. اطبع كل مادة مع درجتها باستخدام zip()، ثم احذف عنصرًا من قائمة الدرجات ولاحظ النتيجة.
أين أتعلم بقية استخدامات zip()؟
هذا الدرس ركز عمدًا على دمج قائمتين عنصرًا بعنصر. إذا كنت تريد الشرح الشامل لـzip() — مثل تحويل قائمتين إلى Dictionary، واستخدام أكثر من قائمتين، والفرق مع enumerate() — فراجع المقال القديم الموجود بالفعل:
شرح دالة zip في Python لدمج القوائم خطوة بخطوة للمبتدئين.
روابط مفيدة
الخلاصة
استخدم zip() عندما تكون لديك قائمتان تمثلان بيانات مترابطة حسب الموضع، مثل أسماء ودرجات أو منتجات وأسعار.
تذكر أن zip() تتوقف عند أقصر قائمة افتراضيًا، ويمكنك استخدام strict=True في Python 3.10+ عندما يجب أن تتساوى الأطوال.
أسئلة شائعة
كيف أدمج قائمتين عنصرًا بعنصر في بايثون؟
استخدم zip(list1, list2) ثم مر على الأزواج بحلقة for.
هل zip() تنشئ List مباشرة؟
لا. في Python 3 ترجع كائنًا قابلًا للتكرار. استخدم list(zip(...)) إذا أردت List من الأزواج.
ماذا يحدث إذا اختلف طول القائمتين؟
تتوقف zip() العادية عند أقصر قائمة، ويمكن استخدام strict=True لاكتشاف اختلاف الأطوال كخطأ.
هل zip() تجمع القائمتين في قائمة واحدة؟
لا. هي تربط العناصر المتقابلة في أزواج. دمج العناصر وراء بعض مهمة مختلفة.

