فهم دالة Transpose/Unzip في بايثون

عند العمل مع البيانات في بايثون، قد تجد نفسك في كثير من الأحيان بحاجة إلى التعامل مع القوائم والتوابل. إحدى العمليات الشائعة هي تحويل قائمة من التوابل ذات العنصرين إلى قائمتين منفصلتين. يمكن أن يكون هذا حاسماً لتحليل البيانات، حيث قد ترغب في فصل المفاتيح عن القيم أو ببساطة تصنيف البيانات لتسهيل المعالجة.

المشكلة

تخيل أن لديك قائمة من التوابل مثل التالية:

original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

هدفك هو تحويل هذه القائمة إلى قائمتين فرديتين:

  • يجب أن تحتوي قائمة واحدة على العناصر الأولى: ['a', 'b', 'c', 'd']
  • يجب أن تحتوي القائمة الثانية على العناصر الثانية: [1, 2, 3, 4]

يمكن وصف هذه العملية بأنها “فك ضغط” التوابل، أو تطبيق دالة تحويل حيث يتم تبديل محاور البيانات.

الحل

لحسن الحظ، توفر بايثون دالة مدمجة تسمى zip يمكن أن تساعد في ذلك. دعنا نتعرف على كيفية استخدامها في كل من بايثون 2.x و 3.x.

استخدام zip في بايثون 2.x

في بايثون 2.x، تعمل zip كعكس فعال عند تطبيق مشغل خاص يعرف بمشغل الفك *. إليك كيفية تطبيقها على قائمة التوابل الأصلية:

result = zip(*original)
# النتيجة ستكون: (['a', 'b', 'c', 'd'], [1, 2, 3, 4])
  • يقوم مشغل * بشكل فعال بفك حزمة التوابل إلى معطيات منفصلة لدالة zip.
  • هذا يعطيك النسخة المحولة مباشرة.

استخدام zip في بايثون 3.x

تعدل بايثون 3.x سلوك zip قليلاً من خلال إرجاع مُكرِّر كسول بدلاً من قائمة. ومع ذلك، لا يزال من السهل تحويل هذا إلى قائمة لتحقيق نفس النتيجة كما في بايثون 2.x. إليك الشيفرة:

result = list(zip(*original))
# النتيجة ستكون: (['a', 'b', 'c', 'd'], [1, 2, 3, 4])
  • من خلال تغليف zip(*original) بـ list(), فإنك تقوم بتحويل المُكرِّر الكسول إلى صيغة قائمة لاستخدام سهل.

الخاتمة

الآن لديك فهم جيد لكيفية تحويل أو “فك ضغط” قائمة من التوابل ذات العنصرين في بايثون! سواء كنت تعمل في بايثون 2.x أو 3.x، توفر دالة zip، عند دمجها مع مشغل الفك، حلاً أنيقًا لفصل العناصر لتسهيل معالجة البيانات.

لا تتردد في دمج هذه الطريقة في مشاريع بايثون الخاصة بك للحصول على شيفرة أنظف وأكثر كفاءة. برمجة سعيدة!