القوائم والصفوف والتقطيع
أتقن عمليات قوائم Python وصيغة التقطيع وعدم قابلية الصفوف للتغيير من خلال أمثلة عملية مستمدة من تحديات برمجية كلاسيكية
القوائم والصفوف والتقطيع درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
قوائم Python: مصفوفات ديناميكية
القائمة list في Python هي مصفوفة ديناميكية يمكنها احتواء أي شيء والنمو تلقائيًا. وهي مرتبة وقابلة للتغيير، وتمنحكم وصولًا فوريًا O(1) باستخدام الفهرس. يوضّح الكود الأساسيات.
nums = [3, 1, 4, 1, 5]
print(nums[0]) # 3
print(nums[-1]) # 5 (last element)
nums.append(9)
print(len(nums)) # 6عمليات القوائم الشائعة
احفظوا هذه العمليات جيدًا: إنّ استخدام append وpop في النهاية يستغرق O(1)، أما استخدام insert في البداية فيستغرق O(n). تجنبوا remove داخل الحلقات الضيقة؛ إذ يعيد الفحص في كل مرة.
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop()) # 3 O(1)
print(stack) # [1, 2]
# insert at index 0 is O(n)
stack.insert(0, 0)
print(stack) # [0, 1, 2]شرح صيغة التقطيع
تُقرأ صيغة التقطيع هكذا: lst[start:stop:step]، وتتوقف قبل stop مباشرةً. والحيلة المعروفة هي أن قيمة step تساوي -1 لعكس القائمة دون تغييرها. يستعرض الكود كل صيغة.
a = [0, 1, 2, 3, 4, 5]
print(a[1:4]) # [1, 2, 3]
print(a[:3]) # [0, 1, 2]
print(a[3:]) # [3, 4, 5]
print(a[::2]) # [0, 2, 4] every other
print(a[::-1]) # [5, 4, 3, 2, 1, 0] reversedينشئ التقطيع نسخًا سطحية
من الأمور التي ينبغي الانتباه إليها: ينشئ التقطيع دائمًا قائمة جديدة، لذلك لا يؤثر تعديل الجزء المقطوع في القائمة الأصلية. لكنه تقطيع سطحي، لذا تبقى القوائم المتداخلة داخله مشتركة. انتبهوا لذلك.
original = [1, 2, 3]
copy = original[:] # shallow copy
copy[0] = 99
print(original) # [1, 2, 3] unchanged
# Nested list pitfall
nested = [[1, 2], [3, 4]]
shallow = nested[:]
shallow[0][0] = 99
print(nested) # [[99, 2], [3, 4]] changed!Tuples: تسلسلات غير قابلة للتغيير
يستخدم tuple الأقواس المستديرة ولا يمكن تغييره بعد إنشائه. وبما أنه قابل للتجزئة، يمكن استخدامه مفتاحًا في dict أو عنصرًا في set، وهو مثالي لأزواج (row, col) في مسائل الشبكات.
point = (3, 7)
print(point[0]) # 3
# Use as dict key
grid = {}
grid[(0, 0)] = 'start'
grid[(2, 3)] = 'end'
print(grid[(0, 0)]) # start
# Unpacking
x, y = point
print(x, y) # 3 7متى نستخدم Tuple بدلًا من List
اختاروا tuple عندما يجب ألا تتغير البيانات، واختاروا list عندما ينبغي أن تتغير. كما تستهلك Tuples قدرًا أقل قليلًا من الذاكرة، ويتراكم هذا التوفير داخل heaps الكبيرة في Dijkstra.
import sys
a_list = [1, 2, 3, 4, 5]
a_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(a_list)) # e.g. 104 bytes
print(sys.getsizeof(a_tuple)) # e.g. 80 bytes
# Tuple returned from function
def min_max(nums):
return min(nums), max(nums)
lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi) # 1 5أخطاء الواحد الزائد في التقطيع
تُعد أخطاء الواحد الزائد أكثر الأخطاء شيوعًا في مسائل المصفوفات. تذكّروا أن lst[i:j] تُرجع عددًا من العناصر يساوي تمامًا j-i. وللتقسيم عند المنتصف، تكون اليسرى هي lst[:mid] واليمنى هي lst[mid:].
lst = [1, 2, 3, 4, 5, 6]
mid = len(lst) // 2 # 3
left = lst[:mid] # [1, 2, 3]
right = lst[mid:] # [4, 5, 6]
print(left, right)
# How many elements?
print(len(lst[2:5])) # 3 (indices 2,3,4)الفهارس السالبة في المقابلات
تدعم Python الفهارس السالبة: إذ تشير lst[-1] إلى العنصر الأخير، وتشير lst[-2] إلى العنصر الذي يسبقه. فضّلوا lst[-1] على lst[len(lst)-1]؛ فالمحاوِرون يلاحظون الصيغة الأنظف.
s = 'abcde'
print(s[-1]) # 'e'
print(s[-3:]) # 'cde'
print(s[:-2]) # 'abc' (all except last 2)
nums = [10, 20, 30, 40]
print(nums[-2]) # 30
nums[-1] = 99
print(nums) # [10, 20, 30, 99]فرز القوائم ومقارنتها
يستخدم فرز Python خوارزمية Timsort (بتعقيد O(n log n) ومستقر). يغيّر lst.sort() القائمة في مكانها، بينما تُرجع sorted(lst) قائمة جديدة. استخدموا الخيار key لترتيب مخصص. راجعوا الكود.
words = ['banana', 'fig', 'apple', 'kiwi']
words.sort(key=len)
print(words) # ['fig', 'kiwi', 'apple', 'banana']
nums = [3, 1, 4, 1, 5]
print(sorted(nums, reverse=True)) # [5, 4, 3, 1, 1]
print(nums) # unchanged: [3, 1, 4, 1, 5]تعديل القوائم أثناء التكرار
هذا خطأ شائع: لا تضيفوا عناصر إلى قائمة أو تزيلوها أثناء المرور عليها بحلقة؛ فقد تتخطون عناصر أو يتعطل البرنامج. أنشئوا قائمة جديدة باستخدام استيعاب القوائم بدلًا من ذلك.
# WRONG — skips elements
nums = [1, 2, 3, 4, 5]
for n in nums:
if n % 2 == 0:
nums.remove(n) # skips 4!
print(nums) # [1, 3, 5]... but 4 got skipped? Actually removes 2,4
# CORRECT — build new list
nums = [1, 2, 3, 4, 5]
nums = [n for n in nums if n % 2 != 0]
print(nums) # [1, 3, 5]تفكيك Tuples في الحلقات
يحافظ تفكيك Tuple على نظافة الحلقات: إذ تُرجع enumerate الزوج (index, value)، بينما تمرّ zip على قائمتين معًا. وتلتقط صيغة *rest الجزء المتبقي في متغير مستقل. راجعوا الكود.
nums = [10, 20, 30]
for i, v in enumerate(nums):
print(i, v)
# 0 10 / 1 20 / 2 30
a = [1, 2, 3]
b = ['x', 'y', 'z']
for x, y in zip(a, b):
print(x, y)
first, *rest = [1, 2, 3, 4]
print(first, rest) # 1 [2, 3, 4]تحقق سريع
تحقق سريع — لنرَ ما اكتسبتموه عن قوائم Python وTuples والتقطيع. أنتم قادرون على ذلك. 💪
مراجعة الدرس
مراجعة: القوائم مصفوفات ديناميكية، وتنفّذ append بتعقيد O(1)، بينما يُرجع التقطيع دائمًا نسخة جديدة، وTuples غير قابلة للتغيير وقابلة للتجزئة. التالي: القواميس والمجموعات.
الأسئلة الشائعة
هل درس «القوائم والصفوف والتقطيع» مجاني؟
نعم — نص درس «القوائم والصفوف والتقطيع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «القوائم والصفوف والتقطيع»؟
أتقن عمليات قوائم Python وصيغة التقطيع وعدم قابلية الصفوف للتغيير من خلال أمثلة عملية مستمدة من تحديات برمجية كلاسيكية تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «القوائم والصفوف والتقطيع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- القوائم والصفوف والتقطيع
- القواميس والمجموعات في Python
- الاختصارات والدوال المضمّنة
- الدوال والإغلاقات وLambda