شرح الاستيعاب القاموسي في بايثون مع أمثلة عملية

دقائق القراءة: 5

مقدمة إلى الاستيعاب القاموسي في بايثون

تُعد القواميس في Python من أقوى هياكل البيانات المدمجة، لأنها تخزّن المعلومات بصيغة أزواج من key-value، أي مفتاح وقيمة. وعندما تحتاج إلى إنشاء قاموس جديد بسرعة وبصياغة مختصرة وواضحة، فإن Dictionary Comprehension يُعد من أفضل الأدوات المتاحة.

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

شرح الاستيعاب القاموسي في بايثون مع أمثلة على إنشاء القواميس

ما هو القاموس في بايثون؟

القاموس في Python هو بنية بيانات تسمح بربط مجموعة من المفاتيح بمجموعة من القيم. يُكتب القاموس بين أقواس معقوفة {}، ويتكون كل عنصر فيه من مفتاح وقيمة.

الصيغة العامة للقاموس تكون كالتالي:

my_dict = {
    "key1": <value1>,
    "key2": <value2>,
    "key3": <value3>,
    "key4": <value4>
}

في المثال السابق، يحتوي القاموس my_dict على أربعة عناصر. ويمكن الوصول إلى أي قيمة عبر المفتاح المرتبط بها، مثل my_dict["key1"].

ما هو Dictionary Comprehension؟

الاستيعاب القاموسي هو أسلوب مختصر ومرن لإنشاء قاموس جديد باستخدام حلقة for داخل صياغة واحدة. ويتميز هذا الأسلوب بأنه أوضح من كتابة حلقات تقليدية طويلة، كما أنه مناسب جداً عندما تريد إنشاء بيانات مشتقة من بيانات موجودة مسبقاً.

الصيغة العامة تكون كما يلي:

<dict_name> = {<new_key>: <new_value> for <item> in <iterable>}

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

إنشاء قاموس من مُكرَّر واحد باستخدام Dictionary Comprehension

إذا كان لديك مُكرَّر واحد فقط، مثل قائمة أو صف tuple، فيمكنك إنشاء قاموس جديد عبر استخدام عناصر هذا المُكرَّر كمفاتيح أو كقيم، مع توليد الجزء الآخر برمجياً.

مثال عملي: إنشاء قاموس خصومات للعملاء

لنفترض أن لدينا قائمة بأسماء العملاء، ونريد منح كل عميل خصماً عشوائياً بين 1 و100. يمكننا استخدام الدالة random.randint() من الوحدة random لتوليد قيمة الخصم.

import random

customers = ["Alex", "Bob", "Carol", "Dave", "Flow", "Katie", "Nate"]

discount_dict = {customer: random.randint(1, 100) for customer in customers}

print(discount_dict)

# Output
# {'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}

ما الذي يحدث هنا؟

  • نمر على جميع الأسماء داخل القائمة customers.
  • نستخدم اسم العميل كمفتاح داخل القاموس.
  • نولّد قيمة خصم عشوائية لكل عميل باستخدام random.randint(1, 100).

هذه الطريقة ممتازة عندما تحتاج إلى بناء قاموس بسرعة انطلاقاً من قائمة بسيطة.

إنشاء قاموس من مُكرَّرين باستخدام zip()

في كثير من الحالات، تكون المفاتيح والقيم موجودة مسبقاً في قائمتين منفصلتين. هنا تظهر فائدة الدالة zip()، التي تجمع العناصر المتقابلة من أكثر من مُكرَّر في أزواج مرتبة.

الصيغة العامة لهذه الحالة:

<dict_name> = {<new_key>: <new_value> for (key, value) in zip(list1, list2)}

باستخدام zip()، يصبح كل زوج من العناصر جاهزاً ليُستخدم مباشرة كعنصر داخل القاموس.

توضيح عمل الدالة zip في بايثون لربط المفاتيح بالقيم

مثال عملي: إنشاء قاموس لدرجات الحرارة الأسبوعية

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

days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
temp_C = [30.5, 32.6, 31.8, 33.4, 29.8, 30.2, 29.9]

الآن ننشئ القاموس باستخدام Dictionary Comprehension:

# Creating a dictionary of weekly temperatures
# from the list of temperatures and days
weekly_temp = {day: temp for (day, temp) in zip(days, temp_C)}

print(weekly_temp)

# Output
# {'Sunday': 30.5, 'Monday': 32.6, 'Tuesday': 31.8, 'Wednesday': 33.4, 'Thursday': 29.8, 'Friday': 30.2, 'Saturday': 29.9}

بعد إنشاء القاموس، يمكنك الوصول إلى درجة حرارة أي يوم بسهولة:

weekly_temp["Thursday"]
# Output
# 29.8

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

استخدام الدالة items() مع القواميس في بايثون

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

مثال:

discount_dict.items()

# Output
# dict_items([('Alex', 16), ('Bob', 26), ('Carol', 83), ('Dave', 21), ('Flow', 38), ('Katie', 47), ('Nate', 89)])

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

إنشاء قاموس جديد من قاموس موجود مع شرط تصفية

من أقوى استخدامات Dictionary Comprehension أنه يسمح لك بإنشاء قاموس جديد من قاموس موجود مسبقاً، مع تصفية العناصر وفق شرط معين.

الصيغة العامة:

<dict_name> = {
    <new_key>: <new_value>
    for (key, value) in <dict>.items()
    if <condition>
}

نستخدم هنا items() للوصول إلى كل زوج من المفتاح والقيمة، ثم نضيف العنصر إلى القاموس الجديد فقط إذا تحقق الشرط.

مثال عملي: تصفية العملاء حسب قيمة الخصم

لنكمل مثال الخصومات السابق. لنفترض أننا نريد استخراج العملاء الذين حصلوا على خصم أقل من 30 دولاراً، حتى نمنحهم عرضاً إضافياً لاحقاً.

customer_10 = {
    customer: discount
    for (customer, discount) in discount_dict.items()
    if discount < 30
}

print(customer_10)

# Output
# {'Alex': 16, 'Bob': 26, 'Dave': 21}

في هذا المثال:

  • مررنا على جميع عناصر القاموس discount_dict.
  • فحصنا قيمة الخصم لكل عميل.
  • أضفنا فقط العملاء الذين تقل قيمة خصمهم عن 30 إلى القاموس الجديد customer_10.

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

متى يكون الاستيعاب القاموسي خياراً مناسباً؟

يفضل استخدام Dictionary Comprehension عندما تكون العملية بسيطة وواضحة، مثل:

  • تحويل قائمة إلى قاموس.
  • دمج قائمتين في قاموس واحد باستخدام zip().
  • تصفية عناصر قاموس موجود.
  • تعديل القيم أو المفاتيح أثناء إنشاء القاموس الجديد.

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

أفضل الممارسات عند استخدام Dictionary Comprehension

  • احرص على أن تكون الصياغة قصيرة وسهلة القراءة.
  • استخدم أسماء متغيرات واضحة مثل customer وdiscount.
  • لا تُفرط في وضع الشروط داخل سطر واحد إذا كان ذلك سيجعل الكود مربكاً.
  • استخدم items() عندما تحتاج إلى المفتاح والقيمة معاً.
  • استخدم zip() فقط عندما تكون القوائم متوافقة من حيث ترتيب العناصر.

ملخص سريع

تعلّمنا في هذا المقال أن Dictionary Comprehension في Python يوفّر طريقة مختصرة وأنيقة لإنشاء القواميس. وقد رأينا ثلاث حالات شائعة:

  1. إنشاء قاموس من مُكرَّر واحد.
  2. إنشاء قاموس من مُكرَّرين باستخدام zip().
  3. إنشاء قاموس جديد من قاموس موجود باستخدام items() مع شرط if.

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

الخلاصة التقنية

يُعد Dictionary Comprehension من الميزات الأساسية التي تمنح لغة Python مرونتها العالية في التعامل مع البيانات. من الناحية التقنية، هو خيار مثالي عندما تريد كتابة كود مختصر وواضح لإنشاء القواميس أو تصفيتها دون التضحية بقابلية القراءة. ومع ذلك، فإن الاستخدام الذكي هو الأساس: إذا كانت الصياغة ستصبح معقدة، فالأفضل العودة إلى الحلقات التقليدية للحفاظ على وضوح المنطق البرمجي.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *