البحث عن الأشياء بالاسم
القاموس (dict) يربط مفاتيح بـقيم: {"AAPL": 184.5, "MSFT": 410.2}. فبينما تجد القائمة العنصر بموضعه، يجده القاموس بمفتاحه، ويبقى البحث سريعًا مهما كثرت المدخلات. prices["AAPL"] تقرأ قيمة، وprices["TSLA"] = 251.0 تضيف مدخلة جديدة أو تستبدل الموجودة، و"AAPL" in prices تسأل هل يوجد مفتاح. قراءة مفتاح غير موجود بالأقواس المربعة ترفع KeyError.
prices = {"AAPL": 184.5, "MSFT": 410.2}
# Read, add and replace
print(prices["AAPL"]) # 184.5
prices["TSLA"] = 251.0
prices["AAPL"] = 185.0
print(prices) # {'AAPL': 185.0, 'MSFT': 410.2, 'TSLA': 251.0}
# in tests the keys; a missing key raises KeyError
print("MSFT" in prices, "GOOG" in prices) # True False
try:
prices["GOOG"]
except KeyError as error:
print("no such key:", error)get: غياب المفتاح ليس خطأً
تُرجع prices.get("GOOG", 0.0) القيمة، أو القيمة الافتراضية التي تعطيها عند غياب المفتاح (None إن لم تعطِ شيئًا)، ولا ترفع خطأً أبدًا. وهذا يسهّل بناء عدّاد: counts[symbol] = counts.get(symbol, 0) + 1 تبدأ من 0 لرمز جديد وتضيف واحدًا عند كل ظهور. استخدم [] حين يكون غياب المفتاح خطأً تريد أن تعرف به، وget حين يكون الغياب أمرًا عاديًا.
# get() with a default never raises
prices = {"AAPL": 184.5}
print(prices.get("AAPL", 0.0)) # 184.5
print(prices.get("GOOG", 0.0)) # 0.0
print(prices.get("GOOG")) # None
# Counting with get
counts = {}
for symbol in ["AAPL", "MSFT", "AAPL", "AAPL"]:
counts[symbol] = counts.get(symbol, 0) + 1
print(counts) # {'AAPL': 3, 'MSFT': 1}المرور على قاموس
حلقة for key in prices العادية تمرّ على المفاتيح. استخدم prices.values() للقيم وprices.items() لأزواج (المفتاح، القيمة) التي تُفكّ في الحلقة: for symbol, price in prices.items(). تتذكر القواميس ترتيب إضافة المفاتيح. لا تضف مفاتيح ولا تحذفها أثناء المرور على القاموس نفسه؛ مرّ على نسخة أو ابنِ قاموسًا جديدًا.
# keys(), values() and items()
positions = {"AAPL": 200, "MSFT": 50, "GOOG": 0}
prices = {"AAPL": 184.5, "MSFT": 410.2}
for symbol in positions:
print(symbol, end=" ") # AAPL MSFT GOOG
print()
total = 0.0
for symbol, quantity in positions.items():
total += quantity * prices.get(symbol, 0.0)
print(round(total, 2)) # 57410.0الحذف والدمج والنسخ
تحذف prices.pop("AAPL", None) مفتاحًا وتُرجع قيمته (القيمة الافتراضية إن لم يكن موجودًا)؛ وdel prices["AAPL"] تحذفه وترفع KeyError إن لم يكن موجودًا. تنسخ a.update(b) مدخلات b إلى a فتغيّره؛ أما {**a, **b} أو a | b فتبني قاموسًا جديدًا تغلب فيه b على المفاتيح المشتركة. وكما في القوائم، copy = prices اسم ثانٍ فقط: استخدم dict(prices) أو prices.copy() لنسخة حقيقية.
# Removing and merging
book = {"AAPL": 200, "MSFT": 50}
sold = book.pop("MSFT", 0)
print(sold, book) # 50 {'AAPL': 200}
# {**a, **b} builds a new dict; b wins on shared keys
defaults = {"fee": 0.001, "currency": "USD"}
custom = {"fee": 0.0005}
settings = {**defaults, **custom}
print(settings) # {'fee': 0.0005, 'currency': 'USD'}
print(defaults) # unchanged: {'fee': 0.001, 'currency': 'USD'}ما الذي يمكن أن يكون مفتاحًا
يجب أن يكون المفتاح قابلًا للتجزئة (hashable)، وهذا يعني عمليًا ألا يتغيّر: النصوص والأرقام وصفوفها مقبولة، أما القوائم والقواميس فلا. تصلح الصفوف مفاتيح مركّبة، مثل (symbol, venue). يمكن أن تكون القيم أي شيء، بما في ذلك قائمة أو قاموس آخر. لا يظهر المفتاح نفسه إلا مرة واحدة، فالإسناد إليه من جديد يستبدل القيمة القديمة.
# A tuple as a compound key, a list as a value
best = {("AAPL", "NYSE"): 184.6, ("AAPL", "ARCA"): 184.5}
print(best[("AAPL", "ARCA")]) # 184.5
fills = {"AAPL": [100, 250], "MSFT": [75]}
fills["AAPL"].append(40)
print(fills) # {'AAPL': [100, 250, 40], 'MSFT': [75]}
# A list cannot be a key
try:
{["AAPL"]: 1}
except TypeError as error:
print("not hashable:", error)prices[symbol] تقول «يجب أن يكون هذا المفتاح موجودًا» وتفشل بصوت عالٍ إن لم يكن. وprices.get(symbol, default) تقول «لا بأس بغيابه». إخفاء خطأ حقيقي خلف قيمة افتراضية سيئ بقدر الانهيار في حالة عادية، لذا قرّر أيهما تقصد. وتتحقق المختبرات أيضًا من أن القواميس التي أُعطيت لك لم تتغيّر.d[key]وd[key] = valueوkey in d: قراءة وكتابة واختبار مفتاح.d.get(key, default): بحث آمن؛d.items(): أزواج للمرور عليها.d.pop(key, default)وdel d[key]وd.update(other)و{**a, **b}: حذف ودمج.
التالي: المجموعات (sets)، مجموعات من القيم الفريدة مع اختبارات انتماء سريعة وعمليات مجموعات أنيقة.
المختبر: ما الذي يُقيَّم
- احتفظ بأحدث سعر لكل رمز باستخدام
latest_prices25 نقطة - عُدّ كم مرة يظهر كل رمز باستخدام
count_symbols25 نقطة - قيّم محفظة من قاموسين باستخدام
portfolio_value25 نقطة - ادمج دفتري مراكز باستخدام
merge_positions25 نقطة