لنستخدم القواميس في مشكلة واقعية. تخيل أنك تبني متجرًا إلكترونيًا، وتحفظ أسعار المنتجات في قاموس:
prices = {'apple': 2, 'box': 5, 'cat': 100, 'dog': 100}
هذا يوضح سبب كون البحث في القاموس قائمًا على المفاتيح لا القيم. ماذا يمكن أن تعني prices[100]؟ هل النتيجة 'dog' أم 'cat' أم الاثنتان؟ يمكن أن تتكرر القيمة في القاموس مرات كثيرة.
أما المفاتيح فيجب أن تكون فريدة. تخيل مثلًا:
prices = {'apple': 2, 'apple': 3}
كم سعر التفاحة؟ نعرف أننا سنكتب prices['apple']، لكن هل القيمة 2 أم 3؟ منطقيًا يجب أن يكون هناك سعر واحد تحت المفتاح نفسه، ولذلك لا يمكن الاعتماد على مفاتيح مكررة لتمثيل قيمتين مختلفتين.
لدينا الآن متجر عادي، وعملاء لديهم قوائم مشتريات مثل ['apple', 'box', 'cat']. نريد حساب السعر الإجمالي بأنفسنا.
أكمل الدالة التالية، وخصوصًا السطر price = ...:
__copyable__ def total_cost(cart, prices): result = 0 for item in cart: price = ... result += price return result
check_result( total_cost( ['apple', 'box', 'cat'], {'apple': 2, 'box': 5, 'cat': 100, 'dog': 100}, ), 107, )
تذكّر أن prices قاموس، وأن العناصر الموجودة في cart هي المفاتيح التي تحتاجها للحصول على الأسعار.
رائع! يمكن استخدام الدالة نفسها أيضًا لتشفير رسائل بسيطة وفك تشفيرها:
__copyable__ __no_auto_translate__ def substitute(string, d): result = "" for letter in string: result += d[letter] return result
plaintext = 'helloworld' encrypted = 'qpeefifmez' letters = {'h': 'q', 'e': 'p', 'l': 'e', 'o': 'f', 'w': 'i', 'r': 'm', 'd': 'z'} reverse = {'q': 'h', 'p': 'e', 'e': 'l', 'f': 'o', 'i': 'w', 'm': 'r', 'z': 'd'} check_result(substitute(plaintext, letters), encrypted) check_result(substitute(encrypted, reverse), plaintext)
الدالة نفسها تعمل في الاتجاهين؛ كل ما نفعله هو تمرير قاموس مختلف.
القاموسان متشابهان جدًا، لكننا نعكس المفتاح والقيمة في كل زوج. عند التشفير نستبدل e بـp، وعند فك التشفير نعيد p إلى e.
لاحظ أن 'e' تظهر كمفتاح وكقيمة داخل letters.
عندما نكتب letters['e'] فنحن نسأل عن 'e' بصفتها مفتاحًا، ولذلك نحصل على 'p'. ولا نستطيع سؤال القاموس نفسه مباشرة عن المفتاح الذي ترتبط به القيمة 'e'. لكن في هذا المثال لدينا القاموس العكسي؛ فـreverse['e'] تعطي 'l'، بينما letters['l'] تعيد 'e' مرة أخرى.
قريبًا ستكتب دالة تنشئ القاموس العكسي تلقائيًا، أي شيئًا مثل:
reverse = swap_keys_values(letters)