تطبيقات

الكلمة ومعناها

القاموس بالمعنى الذي يشير إليه اللفظ. نفترض أن لدينا قاموسًا يحتوي على ترجمة بعض الكلمات من الإنجليزية إلى العربية:

english_to_arabic = {
    'apple': 'تفاحة',
    'banana': 'موزة',
    'orange': 'برتقالة',
}

ربط الأسماء بالأرقام

مثلاً: دليل أرقام الهواتف هو قاموس:

name_to_phone = {
    'Adam': '966xxxxxxxxx',
    'Mohammed': '966xxxxxxxxx',
}

وكذلك دليل أسماء النطاق (DNS: Domain Name System) على شبكة الانرتنت هو قاموس:

domain_to_ip = {
    'google.com': '172.217.14.206',
    'wikipedia.org': '103.86.96.10',
}

اختصار الروابط الطويلة

من استعمالات القاموس: اختصار الروابط الطويلة في روابط قصيرة.

short_to_full = {
    'google': 'https://www.google.com',
    'python': 'https://www.python.org',
    'wiki': 'https://www.wikipedia.org',
}

الاختصارات

أو الاختصارات إلى الكلمة التامة:

abb_to_full = {
    'ASAP': 'As Soon As Possible',
    'BRB': 'Be Right Back',
    'DIY': 'Do It Yourself',
    'EDA': 'Exploratory Data Analysis',
    'FYI': 'For Your Information',
    'SAR': 'Saudi Riyal',
}

ويمكن عكس القاموس بالطريقة التالية:

full_to_abb = {}

for key, value in abb_to_full.items():
    full_to_abb[value] = key

print(full_to_abb)
{'As Soon As Possible': 'ASAP', 'Be Right Back': 'BRB', 'Do It Yourself': 'DIY', 'Exploratory Data Analysis': 'EDA', 'For Your Information': 'FYI', 'Saudi Riyal': 'SAR'}

سلة المشتريات

نفترض أن لدينا سلة تحتوي على مشتريات العميل (basket)، ونريد حساب القيمة الإجمالية لها، ولدينا قائمة بأسعار الفواكه. فنعرف الأسعار على أنها قاموس prices بحيث يشير اسم الفاكهة إلى سعرها (قيمتها المالية).

prices = {
    'apple': 15.25,
    'banana': 10.50,
    'orange': 5.75,
    'cantaloupe': 40.00
}

يجوز تحديث الأسعار هكذا:

prices['banana'] = 12

أو بالمجموع هكذا:

prices.update({'banana': 12, 'orange': 15})

والآن نفترض أن لدينا قائمة بالفواكه التي يريدها العميل:

basket = ['apple', 'apple', 'banana', 'orange', 'banana']

نحسب سعر كل فاكهة في السلة بناءً على الأسعار الموجودة في القاموس:

total = 0

for fruit in basket:
    total += prices[fruit]

print(total)
69.5

تسجيل تفضيلات المستخدم

يجوز أن تكون قيمة المرقوم قاموسًا؛ وهذا يعني أن القاموس قد يتضمن قاموسًا.

هذا المثال يوضح استعمالًا شائعًا لذلك، وهو ترتيب معلومات أو تفضيلات المستخدم.

user = {
    'name': 'Adam',
    'language': 'Arabic',
    'phone': '966xxxxxxxxx',
    'last_updated': '2021-09-01',
    'age': 25,
    'notifications': {
        'email': True,
        'sms': False,
        'push': True
    },
    'emails': ['example1@domain.com', 'example2@domain.com']
}

وللوصول إلى قيمة مضمَّنة، نستعمل الإشارة مرتين، هكذا:

user['notifications']['sms']
False

أما حفظها فسيأتي الكلام عن حفظ البيانات في باب كتابة الملفات وقراءتها إن شاء الله.

الذاكرة القريبة

يجوز أن تسجل نتيجة طلب فعل بمدخلات معيَّنة. حتى إذا ما تكرر الطلب نفس المدخلات؛ توفِّر تكلفة استدعائه بإرجاع النتيجة المحفوظة. وهذا يفيد في أمرين:

  1. الاقتصاد في موارد المعالجة، خصوصًا عند تعقد العمليات.
  2. تقليل وقت الاستجابة.

ويشترط أن يكون الفعل نقيًّا. (انظر قسم الفعل النقي في باب الفعل).

factorial_table = {
    0: 1,
    1: 1,
    2: 2,
    3: 6,
}

def factorial(n):
    if n not in factorial_table:
        factorial_table[n] = n * factorial(n - 1)
    return factorial_table[n]

بل إن بايثون توفر هذه الخاصية للدوال عن طريق المزيِّن (decorator) @functools.lru_cache، هكذا:

import functools

@functools.lru_cache
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

لاحظ عدم الحاجة لتعريف القاموس factorial_table، بل يقوم المزيِّن هو بذلك تلقائيًّا.

استعمال الإنشاء المختصر

تقدم معنا الكلام عن الإنشاء المختصر. وسنستعرضه الآن مع القاموس.

عكس قاموس بحيث تصبح الدلائل هي القيم والقيم هي الدلائل:

idx2label = {
    0: 'cat',
    1: 'dog',
    2: 'bird',
}

label2idx = {label: idx for idx, label in idx2label.items()}
label2idx
{'cat': 0, 'dog': 1, 'bird': 2}

هنا مثال لقاموس من الفواكه، نريد ترشيح ما قيمته أقل من 20:

menu = {
    'apple': 15,
    'banana': 10,
    'orange': 5,
    'cantaloupe': 40
}

filtered_menu = {key: value for key, value in menu.items() if value < 20}
filtered_menu
{'apple': 15, 'banana': 10, 'orange': 5}

وهذا مثال أكثر تعقيدًا. نطبق خصم 20% فقط على العناصر التي يكون سعرها أعلى من المتوسط، مع الحفاظ على بقية الأسعار كما هي. لاحظ أن التعبير هنا هو تعيين شرطي: value * (1 - discount) if value > avg_price else value وليس هو قطعة الترشيح (if)؛ إذ تلك تأتي في نهاية الجملة، بعد قطعة التكرار (for).

menu = {
    'apple': 15,
    'banana': 10,
    'orange': 5,
    'cantaloupe': 40
}

avg_price = sum(menu.values()) / len(menu)
discount = 0.20

discounted_menu = {
    key: value * (1 - discount) if value > avg_price else value
    for key, value in menu.items()
}
discounted_menu
{'apple': 15, 'banana': 10, 'orange': 5, 'cantaloupe': 32.0}