0Pricing
Coding Interview Prep · درس

القواميس والمجموعات في Python

استكشف إنشاء dict وset واختبار العضوية والأنماط الشائعة مثل عدّ التكرارات باستخدام collections.Counter

القواميس والمجموعات في Python درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

قواميس Python: مخازن المفتاح والقيمة

يربط dict في Python المفاتيح بالقيم، ويوفّر في المتوسط عمليات بحث وإدراج وحذف بتعقيد O(1). وهو الأساس وراء مسألة two-sum، والتحقق من anagram، وعدّ التكرارات. يوضّح الكود ذلك.

d = {'apple': 3, 'banana': 5}
print(d['apple'])   # 3
d['cherry'] = 7
print(len(d))       # 3
print('banana' in d)  # True
del d['apple']
print(d)            # {'banana': 5, 'cherry': 7}

بحث آمن باستخدام .get()

تؤدي قراءة مفتاح مفقود باستخدام d[key] إلى تعطل البرنامج مع KeyError. استخدموا d.get(key, default) لإرجاع قيمة بديلة بدلًا من ذلك؛ فهي عادة آمنة تتجنب أخطاء وقت التشغيل المفاجئة.

freq = {}
words = ['the', 'cat', 'sat', 'on', 'the', 'mat']
for w in words:
    freq[w] = freq.get(w, 0) + 1
print(freq)
# {'the': 2, 'cat': 1, 'sat': 1, 'on': 1, 'mat': 1}

print(freq.get('dog', 0))  # 0  (no KeyError)

defaultdict لتجميع أوضح

ينشئ defaultdict(list) تلقائيًا قائمة فارغة لأي مفتاح جديد، فتختفي الشيفرة التمهيدية المتكررة من مسائل التجميع. ويبدأ defaultdict(int) كل مفتاح بالقيمة 0، ما يسهّل العد.

from collections import defaultdict

groups = defaultdict(list)
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
for w in words:
    key = ''.join(sorted(w))  # canonical anagram key
    groups[key].append(w)

print(list(groups.values()))
# [['eat','tea','ate'], ['tan','nat'], ['bat']]

Counter: خرائط تكرار سريعة

إنّ Counter هو dict مخصص للعد: مرّروا إليه أي iterable لتحصلوا فورًا على خريطة للتكرارات. تُرجع most_common(k) أعلى k عناصر. يوضّح الكود فحص anagram.

from collections import Counter

c = Counter('abracadabra')
print(c)           # Counter({'a':5,'b':2,'r':2,'c':1,'d':1})
print(c.most_common(2))  # [('a', 5), ('b', 2)]

# Valid anagram check
def is_anagram(s, t):
    return Counter(s) == Counter(t)

print(is_anagram('anagram', 'nagaram'))  # True

مجموعات Python: مجموعات فريدة غير مرتبة

تحتفظ set بعناصر فريدة، وتوفّر اختبارات عضوية بتعقيد O(1). استخدموا {1, 2, 3} أو set(iterable)، لكن {} ينشئ dict، لذا استخدموا set() لإنشاء مجموعة فارغة. وهي مفيدة جدًا لاكتشاف التكرارات.

seen = set()
nums = [1, 2, 3, 2, 1, 4]
duplicates = []
for n in nums:
    if n in seen:          # O(1) check
        duplicates.append(n)
    seen.add(n)
print(duplicates)  # [2, 1]
print(len(seen))   # 4  (unique values)

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

تجري المجموعات عمليات رياضية: | للاتحاد، و& للتقاطع، و- للفرق، و^ للفرق المتماثل. تحل هذه العمليات أسئلة من نوع «العناصر المشتركة» في سطر واحد.

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a | b)  # {1, 2, 3, 4, 5, 6}  union
print(a & b)  # {3, 4}              intersection
print(a - b)  # {1, 2}              difference
print(a ^ b)  # {1, 2, 5, 6}        symmetric diff

اختبار العضوية: List أم Set

يؤثر هيكل البيانات الذي تختارونه في السرعة. يستغرق التحقق باستخدام in في list تعقيد O(n)، بينما يستغرق O(1) في set. ويُعد تحويل القائمة إلى set قبل عمليات البحث المتكررة طريقة شائعة لتسريع التنفيذ.

word_list = ['apple', 'banana', 'cherry', 'date']
word_set  = set(word_list)

# O(n) per check
print('banana' in word_list)  # True

# O(1) per check
print('banana' in word_set)   # True

# Practical example: find common elements
a = [1, 2, 3, 4, 5]
b = [3, 4, 5, 6, 7]
common = [x for x in a if x in set(b)]
print(common)  # [3, 4, 5]

التكرار على Dicts: المفاتيح والقيم والعناصر

مرّروا على dict باستخدام .keys() أو .values() أو .items(). لا تحذفوا المفاتيح أبدًا أثناء الحلقة؛ اجمعوها أولًا في قائمة، ثم احذفوها بعد ذلك. راجعوا الكود.

scores = {'Alice': 90, 'Bob': 75, 'Carol': 88}

for name, score in scores.items():
    print(f'{name}: {score}')

# Find key with max value
best = max(scores, key=scores.get)
print(best)  # Alice

# Safe deletion
to_del = [k for k, v in scores.items() if v < 80]
for k in to_del:
    del scores[k]
print(scores)  # {'Alice': 90, 'Carol': 88}

Frozenset: مجموعات قابلة للتجزئة

إنّ frozenset مجموعة غير قابلة للتغيير، لذا يمكن استخدامها مفتاحًا في dict أو وضعها داخل set أخرى. وهي مفيدة لتجميع anagrams وفق مجموعة حروفها عندما لا يهم الترتيب.

from collections import defaultdict

words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
groups = defaultdict(list)
for w in words:
    key = frozenset(w)  # hashable; 'eat','tea','ate' all share same key
    groups[key].append(w)

print([sorted(g) for g in groups.values()])
# [['ate','eat','tea'], ['nat','tan'], ['bat']]

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

ينشئ استيعاب القواميس mapping في سطر واحد: {k: v for ...}. وهو مفيد جدًا لعكس dict أو تصفية الأزواج. ملاحظة: يفترض العكس أن القيم فريدة. راجعوا الكود.

# Invert a dict
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
print(inverted)  # {1:'a', 2:'b', 3:'c'}

# Filter by value
scores = {'Alice': 90, 'Bob': 55, 'Carol': 78}
passing = {k: v for k, v in scores.items() if v >= 60}
print(passing)  # {'Alice': 90, 'Carol': 78}

أطول تسلسل متتالٍ

تحل المجموعات مسألة أطول تسلسل متتالٍ بتعقيد O(n): ضعوا جميع الأعداد في set، ثم ابدأوا العد فقط من كل عدد لا يوجد سابقه. لا حاجة إلى الفرز.

def longest_consecutive(nums):
    num_set = set(nums)
    best = 0
    for n in num_set:
        if n - 1 not in num_set:  # start of sequence
            cur = n
            streak = 1
            while cur + 1 in num_set:
                cur += 1
                streak += 1
            best = max(best, streak)
    return best

print(longest_consecutive([100,4,200,1,3,2]))  # 4 (1,2,3,4)

تحقق سريع

تحقق سريع — لنرَ مدى ترسّخ أفكار dict وset من هذا الدرس. ثقوا بحدسكم هنا. 🎯

مراجعة الدرس

مراجعة: توفّر dicts عمليات بحث بتعقيد O(1) للعد والتجميع، وتقلل Counter وdefaultdict من الشيفرة التمهيدية، بينما تحوّل sets عمليات الفحص بتعقيد O(n) إلى فحوص بتعقيد O(1).

الأسئلة الشائعة

هل درس «القواميس والمجموعات في Python» مجاني؟

نعم — نص درس «القواميس والمجموعات في Python» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «القواميس والمجموعات في Python»؟

استكشف إنشاء dict وset واختبار العضوية والأنماط الشائعة مثل عدّ التكرارات باستخدام collections.Counter تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «القواميس والمجموعات في Python»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. القوائم والصفوف والتقطيع
  2. القواميس والمجموعات في Python
  3. الاختصارات والدوال المضمّنة
  4. الدوال والإغلاقات وLambda
← العودة إلى Coding Interview Prep