القواميس المتداخلة واستيعاب القواميس

10.5 القواميس المتداخلة واستيعاب القواميس

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على:

  • شرح بنية القواميس المتداخلة.
  • استخدام استيعاب القواميس لإنشاء كائن قاموس.

القواميس المتداخلة

كما وُصِف سابقًا، تُعد قواميس Python نوعًا من هياكل البيانات التي تسمح بتخزين البيانات في أزواج مفتاح-قيمة. القواميس المتداخلة هي قواميس تُخزَّن كقيم داخل قاموس آخر. مثال على ذلك: هيكل تنظيمي تكون فيه المفاتيح هي الأقسام المختلفة، والقيم قواميس تمثّل موظفي كل قسم. لتخزين معلومات الموظفين في قسم ما، يمكن استخدام قاموس تكون مفاتيحه معرّفات الموظفين وقيمه أسماءهم. توضح الجداول أدناه بنية هذه القواميس المتداخلة وكيفية الوصول إلى القيم المتداخلة.

مثال 10.4

تعريف القواميس المتداخلة والوصول إلى عناصرها

تعريف القواميس المتداخلة
company_org_chart = {
  "Marketing": {
    "ID234": "Jane Smith"
  },
  "Sales": {
    "ID123": "Bob Johnson",
    "ID122": "David Lee"
  },
  "Engineering": {
    "ID303": "Radhika Potlapally",
    "ID321": "Maryam Samimi"
  }
}
جدول 10.8
الوصول إلى عناصر القواميس المتداخلة
print(company_org_chart["Sales"]["ID122"])
print(company_org_chart["Engineering"]["ID321"])
David Lee
Maryam Samimi
جدول 10.9

مفاهيم تطبيقية

بنية القواميس المتداخلة

1.
ما القاموس المتداخل في بايثون؟
  1. قاموس يحتوي على أعداد صحيحة فقط كمفاتيح وقيم.
  2. قاموس يحتوي على قاموس آخر كقيمة.
  3. قاموس يحتوي على سلاسل نصية فقط كمفاتيح وقيم.
  4. قاموس يحتوي على قوائم فقط كمفاتيح وقيم.
2.
كيف يمكن الوصول إلى قيمة في قاموس متداخل في بايثون؟
  1. باستخدام مفتاح القاموس الخارجي
  2. باستخدام مفتاح القاموس الداخلي
  3. باستخدام مفتاحي القاموس الخارجي والداخلي معًا
3.
ما صياغة إنشاء قاموس متداخل في بايثون؟
  1. {key: value}
  2. {key1: {key2: value}}
  3. {key: {value: key2}}

استيعاب القواميس

استيعاب القواميس (Dictionary comprehension) أسلوبٌ موجز وفعّال لإنشاء قاموس في بايثون. بهذا الأسلوب، تُحوَّل عناصر كائن قابل للتكرار إلى أزواج مفتاح-قيمة. وتُشبه صياغتُه صياغةَ استيعاب القوائم (list comprehension)، غير أنه يستخدم الأقواس المتعرجة بدلاً من الأقواس المربعة لتمثيل القاموس.

فيما يلي صياغة عامة لاستيعاب القواميس:

صياغة استيعاب القواميس

    {key_expression: value_expression for element in iterable}

نقطة تحقق

مربعات الأعداد

مفاهيم تطبيقية

استيعاب القواميس

4.
ما ناتج الشِفرة التالية؟
numbers = [1, 2, 3, 4, 5]
my_dict = {x: x**2 for x in numbers if x % 2 == 0}
print(my_dict)
  1. {1: 1, 3: 9, 5: 25}
  2. {2: 4, 4: 16}
  3. {1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
5.
ما ناتج استيعاب القواميس التالي؟
names = ["Alice ", "Bob ", "Charlie "]
name_lengths = {name: len(name) for name in names}
print(name_lengths)
  1. { "Alice ": 5, "Bob ": 3, "Charlie ": 7}
  2. {5: "Alice ", 3: "Bob ", 7: "Charlie "}
  3. { "A ": 5, "B ": 3, "C ": 7}
6.

ما ناتج استيعاب القواميس التالي؟

my_dict = {i: i**2 for i in range(4)}
print(my_dict)
  1. {0: 0, 1: 1, 2: 4, 3: 9}
  2. {0: 0, 1: 1, 2: 4}
  3. {1: 1, 2: 4, 3: 9}

جرّب بنفسك

أسعار المنتجات

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

جرّب بنفسك

إعادة هيكلة بيانات الشركة

افترض أن لديك قاموسًا يحتوي على معلومات حول الموظفين في شركة. يُعرَّف كل موظف برقم تعريف، وتتضمن معلوماته اسمه وقسمه وراتبه. تريد إنشاء قاموس متداخل يجمع الموظفين حسب القسم حتى تتمكن من رؤية أسماء ورواتب جميع الموظفين في كل قسم بسهولة. اكتب برنامج بايثون يأخذ قاموسًا مدخلاً، employees، ويُخرج قاموسًا متداخلاً، dept_employees، يجمع الموظفين حسب القسم.

    Input:
    employees = {
      1001: {"name": "Alice", "department": "Engineering", "salary": 75000},
      1002: {"name": "Bob", "department": "Sales", "salary": 50000},
      1003: {"name": "Charlie", "department": "Engineering", "salary": 80000},
      1004: {"name": "Dave", "department": "Marketing", "salary": 60000},
      1005: {"name": "Eve", "department": "Sales", "salary": 55000}
    }
    Resulting dictionary:
    
    {
    "Engineering": {1001: {"name": "Alice", "salary": 75000}, 1003: {"name": 
    "Charlie", "salary": 80000}},
    "Sales": {1002: {"name": "Bob", "salary": 50000}, 1005: {"name": "Eve", 
    "salary": 55000}},
    "Marketing": {1004: {"name": "Dave", "salary": 60000}}
    }