الوصول إلى عناصر القائمة في بايثون
بعد أن تعلمنا إنشاء القوائم في الدرس السابق، حان الوقت للتعمق في كيفية الوصول إلى عناصرها. الوصول الصحيح لعناصر القائمة هو أساس أي معالجة للبيانات. سواء كنت تريد قراءة عنصر واحد أو استخراج جزء من القائمة، بايثون توفر أدوات قوية ومرنة لذلك.
في هذا الدرس، ستتعلم جميع طرق الوصول لعناصر القوائم: من الفهرسة البسيطة إلى التقطيع المتقدم، مع فهم عميق للفهارس السالبة والقوائم المتداخلة.
1. الفهرسة الموجبة (Positive Indexing)
كل عنصر في القائمة له رقم يسمى الفهرس (Index). الفهرسة في بايثون تبدأ من الصفر، أي أن العنصر الأول فهرسه 0، والثاني فهرسه 1، وهكذا.
fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]
# [0] [1] [2] [3] [4]
print("=== الفهرسة الموجبة ===")
print(f"القائمة: {fruits}")
print(f"عدد العناصر: {len(fruits)}")
print("-" * 40)
print(f"fruits[0] = {fruits[0]}") # العنصر الأول
print(f"fruits[1] = {fruits[1]}") # العنصر الثاني
print(f"fruits[2] = {fruits[2]}") # العنصر الثالث
print(f"fruits[3] = {fruits[3]}") # العنصر الرابع
print(f"fruits[4] = {fruits[4]}") # العنصر الخامس (الأخير)
IndexError. مثلاً fruits[5] سيسبب خطأ لأن القائمة تحتوي على 5 عناصر فقط (0-4).
2. الفهرسة السالبة (Negative Indexing)
بايثون تتميز بدعم الفهرسة السالبة التي تبدأ من نهاية القائمة. الفهرس -1 يشير للعنصر الأخير، -2 لما قبل الأخير، وهكذا.
fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]
# [-5] [-4] [-3] [-2] [-1]
print("=== الفهرسة السالبة ===")
print(f"fruits[-1] = {fruits[-1]}") # الأخير
print(f"fruits[-2] = {fruits[-2]}") # ما قبل الأخير
print(f"fruits[-3] = {fruits[-3]}") # الثالث من الآخر
print(f"fruits[-4] = {fruits[-4]}") # الرابع من الآخر
print(f"fruits[-5] = {fruits[-5]}") # الأول
# مقارنة بين الفهرسة الموجبة والسالبة
print("\n=== مقارنة ===")
print(f"fruits[0] = fruits[-5] ? {fruits[0] == fruits[-5]}")
print(f"fruits[4] = fruits[-1] ? {fruits[4] == fruits[-1]}")
items[-1] يعطيك دائماً آخر عنصر.
3. التقطيع (Slicing)
التقطيع يسمح باستخراج جزء من القائمة. الصيغة هي [start:end:step] حيث start هو بداية التقطيع (مشمول)، end هو نهايته (غير مشمول)، و step هو الخطوة.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"القائمة الأصلية: {numbers}")
print("=" * 45)
# تقطيع أساسي [start:end]
print(f"[2:6] من 2 إلى 5: {numbers[2:6]}")
print(f"[0:4] أول 4 عناصر: {numbers[0:4]}")
print(f"[:4] أول 4 عناصر: {numbers[:4]}") # بدون start
print(f"[6:] من 6 للنهاية: {numbers[6:]}") # بدون end
print(f"[:] نسخة كاملة: {numbers[:]}")
# تقطيع مع خطوة [start:end:step]
print("\n=== التقطيع مع خطوة ===")
print(f"[::2] كل عنصر ثاني: {numbers[::2]}")
print(f"[1::2] العناصر الفردية: {numbers[1::2]}")
print(f"[::3] كل ثالث عنصر: {numbers[::3]}")
# عكس القائمة
print("\n=== عكس القائمة ===")
print(f"[::-1] معكوسة: {numbers[::-1]}")
4. الوصول للقوائم المتداخلة
القوائم المتداخلة (Nested Lists) هي قوائم تحتوي على قوائم أخرى. للوصول لعناصرها، نستخدم فهرسة متعددة.
# مصفوفة 3x3
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print("=== المصفوفة ===")
for row in matrix:
print(f" {row}")
print("\n=== الوصول للعناصر ===")
print(f"matrix[0] = {matrix[0]}") # الصف الأول
print(f"matrix[0][0] = {matrix[0][0]}") # العنصر (0,0)
print(f"matrix[1][2] = {matrix[1][2]}") # العنصر (1,2)
print(f"matrix[2][1] = {matrix[2][1]}") # العنصر (2,1)
# قائمة طلاب مع درجاتهم
students = [
["أحمد", [85, 90, 78]],
["سارة", [92, 88, 95]],
["محمد", [76, 82, 80]]
]
print("\n=== بيانات الطلاب ===")
for student in students:
name = student[0]
grades = student[1]
avg = sum(grades) / len(grades)
print(f"{name}: الدرجات {grades}, المتوسط: {avg:.1f}")
5. التحقق من وجود العناصر
قبل الوصول لعنصر، قد تحتاج للتحقق من وجوده لتجنب الأخطاء.
fruits = ["Apple", "Banana", "Cherry"]
# التحقق باستخدام in
print(f"'Apple' في القائمة؟ {'Apple' in fruits}")
print(f"'Mango' في القائمة؟ {'Mango' in fruits}")
# التحقق من الفهرس قبل الوصول
index = 5
if index < len(fruits):
print(f"العنصر [{index}]: {fruits[index]}")
else:
print(f"الفهرس {index} خارج النطاق (القائمة تحتوي {len(fruits)} عناصر)")
6. أفضل الممارسات
- استخدم الفهرسة السالبة للوصول من النهاية
- تحقق من حدود القائمة قبل الوصول
- استخدم التقطيع لنسخ القوائم
- استخدم
inللتحقق من الوجود
- لا تستخدم فهارس خارج النطاق
- لا تنس أن end في التقطيع غير مشمول
- لا تخلط بين الفهرسة والقيمة
- لا تفترض وجود عنصر دون التحقق
ملخص الدرس
- الفهرسة الموجبة تبدأ من 0
- الفهرسة السالبة تبدأ من -1 (الأخير)
- التقطيع
[start:end:step]يستخرج جزءاً من القائمة - القوائم المتداخلة تحتاج فهرسة متعددة
- استخدم
inللتحقق من وجود عنصر