الوصول إلى عناصر القائمة في بايثون

بعد أن تعلمنا إنشاء القوائم في الدرس السابق، حان الوقت للتعمق في كيفية الوصول إلى عناصرها. الوصول الصحيح لعناصر القائمة هو أساس أي معالجة للبيانات. سواء كنت تريد قراءة عنصر واحد أو استخراج جزء من القائمة، بايثون توفر أدوات قوية ومرنة لذلك.

في هذا الدرس، ستتعلم جميع طرق الوصول لعناصر القوائم: من الفهرسة البسيطة إلى التقطيع المتقدم، مع فهم عميق للفهارس السالبة والقوائم المتداخلة.

1. الفهرسة الموجبة (Positive Indexing)

كل عنصر في القائمة له رقم يسمى الفهرس (Index). الفهرسة في بايثون تبدأ من الصفر، أي أن العنصر الأول فهرسه 0، والثاني فهرسه 1، وهكذا.

positive_indexing.py
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]}")  # العنصر الخامس (الأخير)
النتيجة
=== الفهرسة الموجبة === القائمة: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'] عدد العناصر: 5 ---------------------------------------- fruits[0] = Apple fruits[1] = Banana fruits[2] = Cherry fruits[3] = Date fruits[4] = Elderberry
تحذير: إذا استخدمت فهرساً خارج النطاق، ستحصل على خطأ IndexError. مثلاً fruits[5] سيسبب خطأ لأن القائمة تحتوي على 5 عناصر فقط (0-4).

2. الفهرسة السالبة (Negative Indexing)

بايثون تتميز بدعم الفهرسة السالبة التي تبدأ من نهاية القائمة. الفهرس -1 يشير للعنصر الأخير، -2 لما قبل الأخير، وهكذا.

negative_indexing.py
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]}")
النتيجة
=== الفهرسة السالبة === fruits[-1] = Elderberry fruits[-2] = Date fruits[-3] = Cherry fruits[-4] = Banana fruits[-5] = Apple === مقارنة === fruits[0] = fruits[-5] ? True fruits[4] = fruits[-1] ? True
متى تستخدم الفهرسة السالبة؟ عندما تريد الوصول للعناصر من نهاية القائمة دون الحاجة لمعرفة طولها. مثلاً items[-1] يعطيك دائماً آخر عنصر.

3. التقطيع (Slicing)

التقطيع يسمح باستخراج جزء من القائمة. الصيغة هي [start:end:step] حيث start هو بداية التقطيع (مشمول)، end هو نهايته (غير مشمول)، و step هو الخطوة.

slicing_basics.py
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]}")
النتيجة
القائمة الأصلية: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ============================================= [2:6] من 2 إلى 5: [2, 3, 4, 5] [0:4] أول 4 عناصر: [0, 1, 2, 3] [:4] أول 4 عناصر: [0, 1, 2, 3] [6:] من 6 للنهاية: [6, 7, 8, 9] [:] نسخة كاملة: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] === التقطيع مع خطوة === [::2] كل عنصر ثاني: [0, 2, 4, 6, 8] [1::2] العناصر الفردية: [1, 3, 5, 7, 9] [::3] كل ثالث عنصر: [0, 3, 6, 9] === عكس القائمة === [::-1] معكوسة: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

4. الوصول للقوائم المتداخلة

القوائم المتداخلة (Nested Lists) هي قوائم تحتوي على قوائم أخرى. للوصول لعناصرها، نستخدم فهرسة متعددة.

nested_lists.py
# مصفوفة 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. التحقق من وجود العناصر

قبل الوصول لعنصر، قد تحتاج للتحقق من وجوده لتجنب الأخطاء.

check_existence.py
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 للتحقق من وجود عنصر

الخطوة التالية

تعلم كيفية التكرار على عناصر القوائم

الدرس التالي: التكرار على القوائم
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن