Kodokon kodokon.com

البنى المتقدّمة: الصفوف والمجموعات ووحدة collections

اختر البنية المناسبة لكل حاجة: الصفوف غير القابلة للتغيير، والمجموعات لاختبارات الانتماء بتعقيد O(1)، وCounter وdefaultdict للأنماط المتكرّرة.

9 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

اختيار بنية البيانات الصحيحة يحسم قابلية القراءة والأداء في خطوة واحدة. إن الصف (tuple) متتالية غير قابلة للتغيير: مثالي لسجل غير متجانس ثابت الحجم (إحداثيات، أو زوج مفتاح-قيمة). وعدم القابلية للتغيير يعني قابلية التجزئة (hashable) (إن كانت محتوياته كذلك): لذا يمكن للصف أن يكون مفتاح قاموس أو عنصر مجموعة، وهو ما لا تستطيعه القائمة. ويجعل التفكيك (unpacking) الكود معبّرًا - والدالة التي "تُرجِع عدة قيم" تُرجِع في الحقيقة صفًّا.

PYTHON
point = (48.85, 2.35)
lat, lon = point

def min_max(values):
    return min(values), max(values)

low, high = min_max([3, 1, 4, 1, 5])
print(low, high)

distances = {("paris", "lyon"): 465}
print(distances[("paris", "lyon")])
التفكيك، والإرجاع المتعدّد، والصف كمفتاح قاموس

تضمن المجموعة (set) التفرّد وتوفّر اختبار انتماء بتعقيد O(1) في المتوسط، حيث تكلّف القائمة O(n). وفي حلقة تتحقق من x in collection آلاف المرات، يظهر الفرق فورًا. أما مُعامِلات المجموعات (& التقاطع، و- الفرق، و| الاتحاد) فهي ترقية حقيقية مقارنة بالحلقات المتداخلة: فمقارنة قائمتين من المعرّفات - من اختفى ومن هو جديد - تتّسع في سطرين.

PYTHON
active = {"ada", "linus", "guido"}
banned = {"linus", "mallory"}

print(active & banned)
print(active - banned)
print(active | banned)

emails = ["a@x.io", "b@x.io", "a@x.io"]
unique = set(emails)
print(len(unique))
عمليات المجموعات وإزالة التكرارات

تغطي الوحدة collections حاجتين يوميتين. يَعُدّ Counter تكرارات العناصر في كائن قابل للتكرار ويوفّر most_common(n) - لا مزيد من قواميس العدّ المكتوبة يدويًا. ويبني defaultdict(factory) القيمة الغائبة على الفور: وdefaultdict(list) هو الأداة النموذجية لتجميع العناصر حسب المفتاح دون اختبار وجود المفتاح في كل دورة من الحلقة.

PYTHON
from collections import Counter, defaultdict

words = ["go", "py", "go", "rs", "go"]
counts = Counter(words)
print(counts.most_common(2))

groups = defaultdict(list)
pairs = [("fr", "Ada"), ("us", "Lin"), ("fr", "Zoe")]
for country, name in pairs:
    groups[country].append(name)
print(dict(groups))
العدّ بـCounter والتجميع بـdefaultdict

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. لماذا يمكن للصف أن يكون مفتاح قاموس، خلافًا للقائمة؟
    • لأن إنشاءه أسرع
    • لأنه غير قابل للتغيير، ومن ثمّ قابل للتجزئة
    • لأنه لا يمكن أن يحتوي إلا على أعداد
    • لأن القواميس تحوّل القوائم إلى صفوف
  2. أنت تختبر x in collection آلاف المرات على 100000 عنصر. أيّ بنية ينبغي أن تختار؟
    • قائمة، تُمسح تسلسليًا
    • مجموعة، بانتماء بتعقيد O(1) في المتوسط
    • صف، أكثر إحكامًا من القائمة
  3. مع groups = defaultdict(list)، ماذا تفعل قراءة مفتاح غائب؟
    • تُطلق خطأ KeyError
    • تُرجِع قائمة فارغة وتُدرِج المفتاح
    • تُرجِع None دون تعديل القاموس