بايثون بالمثال 13: البحث داخل List في Python بطريقة عملية

البحث داخل List في Python بطريقة عملية للمبتدئين

في الدروس السابقة من سلسلة بايثون بالمثال تعاملنا مع القوائم List بطرق عملية مثل فلترة العناصر وترتيبها. واليوم سنأخذ مهارة جديدة ومهمة جدًا: البحث داخل List في Python.

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

في هذا الدرس من بايثون العرب سنتعلم البحث داخل List باستخدام in، واستخدام for، واستخدام index() و count()، ثم سنطبق على البحث داخل قائمة تحتوي على قواميس Dictionaries، وهي حالة شائعة جدًا في المشاريع.

{getToc} $title={محتوى المقال}

الفكرة ببساطة: إذا أردت معرفة هل العنصر موجود فقط، استخدم in. وإذا أردت تنفيذ عملية عند العثور عليه، استخدم for. وإذا أردت موقعه داخل القائمة، استخدم index() بحذر. {alertInfo}

ما معنى البحث داخل List في Python؟

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

مثال بسيط:

names = ["Ali", "Sara", "Omar", "Mona"]

قد نريد أن نعرف:

  • هل الاسم "Sara" موجود؟
  • في أي موقع يوجد الاسم "Omar"؟
  • هل توجد أسماء تبدأ بحرف معين؟
  • كم مرة يتكرر عنصر معين؟
  • كيف نبحث داخل قائمة من بيانات الطلاب؟

شرح فكرة البحث داخل List في Python ومعرفة هل العنصر موجود أم لا

الطريقة الأولى: البحث باستخدام in

أسهل طريقة للبحث داخل قائمة هي استخدام العامل in. هذه الطريقة تجيبك بنعم أو لا: هل العنصر موجود داخل القائمة؟

names = ["Ali", "Sara", "Omar", "Mona"]

if "Sara" in names:
    print("الاسم موجود")
else:
    print("الاسم غير موجود")

الناتج:

الاسم موجود

هذه الطريقة واضحة ومناسبة عندما تريد فقط معرفة وجود العنصر.


استخدام in للبحث عن عنصر داخل List في Python بطريقة سهلة

البحث عن رقم داخل List

نفس الفكرة تعمل مع الأرقام:

numbers = [10, 20, 30, 40]

target = 30

if target in numbers:
    print("الرقم موجود")
else:
    print("الرقم غير موجود")

الناتج:

الرقم موجود

استخدام not in للبحث العكسي

إذا أردت التأكد أن العنصر غير موجود، يمكنك استخدام not in.

blocked_users = ["spam1", "test_user", "fake_account"]

username = "Ali"

if username not in blocked_users:
    print("يمكن للمستخدم الدخول")
else:
    print("المستخدم محظور")

الناتج:

يمكن للمستخدم الدخول

الطريقة الثانية: البحث باستخدام for

استخدام in ممتاز عندما تريد معرفة وجود العنصر فقط. لكن إذا أردت فحص كل عنصر وتنفيذ شرط أو طباعة معلومات، فاستخدم حلقة for.

names = ["Ali", "Sara", "Omar", "Mona"]

target = "Omar"

for name in names:
    if name == target:
        print("تم العثور على الاسم:", name)

الناتج:

تم العثور على الاسم: Omar

استخدام for للبحث داخل List في Python وتنفيذ شرط عند العثور على العنصر

إيقاف البحث عند العثور على العنصر باستخدام break

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

names = ["Ali", "Sara", "Omar", "Mona"]

target = "Omar"

for name in names:
    if name == target:
        print("تم العثور على الاسم")
        break

استخدام break يجعل البرنامج أكثر كفاءة، خصوصًا إذا كانت القائمة طويلة.

استخدام for مع else في البحث

في Python يمكن استخدام else مع حلقة for. الجزء else يعمل إذا انتهت الحلقة بدون تنفيذ break.

names = ["Ali", "Sara", "Omar"]

target = "Mona"

for name in names:
    if name == target:
        print("تم العثور على الاسم")
        break
else:
    print("الاسم غير موجود")

الناتج:

الاسم غير موجود
معلومة مفيدة: استخدام for...else ليس شائعًا عند كل المبتدئين، لكنه مفيد جدًا في حالات البحث عندما تريد تنفيذ كود فقط إذا لم يتم العثور على العنصر. {alertInfo}

الطريقة الثالثة: معرفة موقع العنصر باستخدام index

إذا أردت معرفة موقع العنصر داخل القائمة، استخدم index().

names = ["Ali", "Sara", "Omar", "Mona"]

position = names.index("Omar")

print(position)

الناتج:

2

تذكر أن الفهرسة في Python تبدأ من الصفر، لذلك:

  • "Ali" موقعه 0.
  • "Sara" موقعه 1.
  • "Omar" موقعه 2.

المشكلة المهمة مع index

إذا استخدمت index() مع عنصر غير موجود، سيظهر خطأ ValueError.

names = ["Ali", "Sara", "Omar"]

position = names.index("Mona")

قد يظهر:

ValueError: 'Mona' is not in list

لذلك الأفضل أن تفحص وجود العنصر أولًا:

names = ["Ali", "Sara", "Omar"]

target = "Mona"

if target in names:
    position = names.index(target)
    print("الموقع:", position)
else:
    print("العنصر غير موجود")

الطريقة الرابعة: حساب عدد مرات تكرار العنصر باستخدام count

إذا أردت معرفة كم مرة يتكرر عنصر معين داخل القائمة، استخدم count().

items = ["apple", "banana", "apple", "orange", "apple"]

apple_count = items.count("apple")

print(apple_count)

الناتج:

3

هذه الطريقة مفيدة في البرامج التي تحتاج إلى عدّ التكرارات بشكل بسيط.

الطريقة الخامسة: البحث عن عناصر تحقق شرطًا

أحيانًا لا تبحث عن قيمة محددة، بل تبحث عن عناصر تحقق شرطًا معينًا. مثلًا: الأرقام الأكبر من 50.

grades = [45, 80, 60, 30, 95]

for grade in grades:
    if grade >= 60:
        print("درجة ناجحة:", grade)

الناتج:

درجة ناجحة: 80
درجة ناجحة: 60
درجة ناجحة: 95

استخراج كل العناصر المطابقة في List جديدة

إذا أردت حفظ النتائج المطابقة داخل قائمة جديدة:

grades = [45, 80, 60, 30, 95]

passed_grades = []

for grade in grades:
    if grade >= 60:
        passed_grades.append(grade)

print(passed_grades)

الناتج:

[80, 60, 95]

هذه الفكرة قريبة من درس فلترة عناصر القائمة. يمكنك الرجوع إلى: بايثون بالمثال 11: فلترة عناصر List في Python باستخدام for و if إذا أردت مراجعة الفلترة بشكل أوسع.

البحث باستخدام List Comprehension

يمكن كتابة المثال السابق بطريقة أقصر باستخدام List Comprehension:

grades = [45, 80, 60, 30, 95]

passed_grades = [grade for grade in grades if grade >= 60]

print(passed_grades)

الناتج:

[80, 60, 95]

إذا كانت هذه الصيغة جديدة عليك، لا تقلق. يمكنك استخدام for العادية أولًا، ثم الانتقال إلى List Comprehension لاحقًا.

البحث في النصوص داخل List

لنفترض أن لدينا قائمة كلمات ونريد البحث عن الكلمات التي تحتوي على حرف معين.

words = ["python", "java", "javascript", "php"]

for word in words:
    if "p" in word:
        print(word)

الناتج:

python
javascript
php

لاحظ أن in هنا استخدمناها مرتين:

  • الأولى للمرور على عناصر القائمة: for word in words.
  • الثانية للبحث داخل النص نفسه: "p" in word.

البحث بدون حساسية لحالة الأحرف

إذا كنت تبحث داخل نصوص إنجليزية، قد تواجه مشكلة الحروف الكبيرة والصغيرة.

names = ["Ali", "sara", "OMAR"]

target = "omar"

for name in names:
    if name.lower() == target.lower():
        print("تم العثور على الاسم:", name)

الناتج:

تم العثور على الاسم: OMAR

استخدمنا lower() حتى نجعل المقارنة غير حساسة لحالة الأحرف.

البحث داخل List تحتوي على Dictionaries

في المشاريع العملية، لن تكون القوائم دائمًا عبارة عن أرقام أو نصوص فقط. كثيرًا ما تكون القائمة تحتوي على قواميس.

مثال:

students = [
    {"id": 1, "name": "Ali", "grade": 90},
    {"id": 2, "name": "Sara", "grade": 85},
    {"id": 3, "name": "Omar", "grade": 70}
]

نريد البحث عن الطالب الذي رقمه 2.

target_id = 2

for student in students:
    if student["id"] == target_id:
        print("تم العثور على الطالب:", student["name"])
        break

الناتج:

تم العثور على الطالب: Sara

البحث داخل قائمة من القواميس في Python حسب الاسم أو الرقم أو الشرط

البحث عن طالب بالاسم داخل قائمة قواميس

يمكن البحث بالاسم بنفس الطريقة:

students = [
    {"id": 1, "name": "Ali", "grade": 90},
    {"id": 2, "name": "Sara", "grade": 85},
    {"id": 3, "name": "Omar", "grade": 70}
]

target_name = "Omar"

for student in students:
    if student["name"] == target_name:
        print(student)
        break

الناتج:

{'id': 3, 'name': 'Omar', 'grade': 70}

كتابة دالة للبحث داخل List

بدل تكرار نفس الكود في كل مرة، يمكننا كتابة دالة:

def find_student_by_id(students, student_id):
    for student in students:
        if student["id"] == student_id:
            return student

    return None

ثم نستخدمها:

students = [
    {"id": 1, "name": "Ali", "grade": 90},
    {"id": 2, "name": "Sara", "grade": 85}
]

student = find_student_by_id(students, 2)

if student is not None:
    print("الطالب:", student["name"])
else:
    print("لم يتم العثور على الطالب")

الناتج:

الطالب: Sara

استخدام الدوال يجعل الكود أكثر تنظيمًا وأسهل في إعادة الاستخدام.

البحث عن كل العناصر المطابقة داخل قائمة قواميس

إذا أردت كل الطلاب الناجحين مثلًا:

students = [
    {"name": "Ali", "grade": 90},
    {"name": "Sara", "grade": 55},
    {"name": "Omar", "grade": 70}
]

passed_students = []

for student in students:
    if student["grade"] >= 60:
        passed_students.append(student)

print(passed_students)

الناتج:

[{'name': 'Ali', 'grade': 90}, {'name': 'Omar', 'grade': 70}]

استخدام any لمعرفة هل يوجد عنصر يحقق شرطًا

إذا أردت فقط معرفة هل يوجد طالب ناجح، يمكنك استخدام any().

grades = [40, 55, 70]

has_passed = any(grade >= 60 for grade in grades)

print(has_passed)

الناتج:

True

معنى any(): هل يوجد عنصر واحد على الأقل يحقق الشرط؟

استخدام all للتأكد أن كل العناصر تحقق شرطًا

إذا أردت التأكد أن كل الطلاب ناجحون:

grades = [80, 90, 70]

all_passed = all(grade >= 60 for grade in grades)

print(all_passed)

الناتج:

True

معنى all(): هل كل العناصر تحقق الشرط؟

الفرق بين طرق البحث داخل List

الطريقة ماذا تفعل؟ متى أستخدمها؟
in تفحص هل العنصر موجود عندما تريد نتيجة نعم أو لا
not in تفحص أن العنصر غير موجود للتحقق العكسي
for تمر على العناصر وتفحصها واحدًا واحدًا عندما تريد تنفيذ منطق خاص
index() تعطيك موقع العنصر عندما تحتاج رقم الفهرس، مع فحص وجود العنصر أولًا
count() تحسب عدد مرات التكرار عندما تريد معرفة عدد مرات ظهور عنصر
any() تفحص هل يوجد عنصر يحقق شرطًا عندما تريد إجابة منطقية سريعة
all() تفحص هل كل العناصر تحقق شرطًا للتأكد من أن كل العناصر مناسبة

أخطاء شائعة عند البحث داخل List في Python

1. استخدام index بدون فحص وجود العنصر

خطأ:

position = names.index("Mona")

إذا لم يكن العنصر موجودًا، سيظهر ValueError. الأفضل:

if "Mona" in names:
    print(names.index("Mona"))

2. نسيان حساسية الحروف الكبيرة والصغيرة

"Omar" يختلف عن "omar". استخدم lower() إذا أردت تجاهل الفرق.

3. البحث عن نص داخل قائمة أرقام

مثال:

numbers = [10, 20, 30]

print("10" in numbers)

الناتج:

False

لأن "10" نص، بينما 10 رقم.

4. استخدام in بطريقة خاطئة مع القواميس داخل القائمة

إذا كانت القائمة تحتوي على قواميس، فلا تبحث هكذا:

if "Ali" in students:
    print("موجود")

لأن students لا تحتوي على نصوص مباشرة، بل تحتوي على قواميس. يجب المرور على العناصر وفحص المفتاح:

for student in students:
    if student["name"] == "Ali":
        print("موجود")

مثال عملي كامل: برنامج بحث عن طالب

الآن لنكتب برنامجًا صغيرًا يبحث عن طالب داخل قائمة حسب الرقم.

students = [
    {"id": 1, "name": "Ali", "grade": 90},
    {"id": 2, "name": "Sara", "grade": 85},
    {"id": 3, "name": "Omar", "grade": 70}
]

target_id = 2

found_student = None

for student in students:
    if student["id"] == target_id:
        found_student = student
        break

if found_student is not None:
    print("تم العثور على الطالب:")
    print("الاسم:", found_student["name"])
    print("الدرجة:", found_student["grade"])
else:
    print("لم يتم العثور على الطالب")

الناتج:

تم العثور على الطالب:
الاسم: Sara
الدرجة: 85

تحويل البحث إلى دالة عملية

يمكننا جعل البرنامج أفضل باستخدام دالة:

def find_by_id(items, item_id):
    for item in items:
        if item["id"] == item_id:
            return item

    return None

ثم:

student = find_by_id(students, 3)

if student:
    print(student["name"])
else:
    print("غير موجود")

هذه الطريقة مناسبة عندما تريد استخدام البحث أكثر من مرة داخل البرنامج.

أفضل ممارسات البحث داخل List

  • استخدم in إذا كنت تريد معرفة هل العنصر موجود فقط.
  • استخدم for عندما تحتاج إلى شرط أو منطق خاص أثناء البحث.
  • استخدم break إذا كنت تريد أول نتيجة فقط.
  • استخدم index() فقط عندما تحتاج موقع العنصر، وافحص وجوده أولًا.
  • استخدم count() لمعرفة عدد مرات التكرار.
  • استخدم lower() عند البحث في النصوص بدون حساسية لحالة الأحرف.
  • استخدم دالة خاصة إذا كان البحث سيتكرر في أكثر من مكان.
  • عند البحث داخل قائمة قواميس، حدد المفتاح الذي ستبحث بناءً عليه.
  • انتبه لاختلاف نوع البيانات بين النص والرقم.
  • إذا كانت البيانات كبيرة جدًا ومتكررة البحث، فكر لاحقًا في استخدام Dictionary بدل List لتحسين الوصول.

متى لا تكون List أفضل خيار للبحث؟

القائمة مناسبة للتعلم والبيانات الصغيرة والمتوسطة. لكن إذا كان لديك عدد كبير جدًا من العناصر وتبحث كثيرًا حسب معرف مثل id، فقد يكون Dictionary أفضل.

مثال: بدل هذه القائمة:

students = [
    {"id": 1, "name": "Ali"},
    {"id": 2, "name": "Sara"}
]

يمكنك استخدام قاموس:

students_by_id = {
    1: {"name": "Ali"},
    2: {"name": "Sara"}
}

print(students_by_id[2])

لكن للمبتدئين، تعلم البحث داخل List أولًا خطوة أساسية ومهمة.

تدريب عملي

لديك القائمة التالية:

products = [
    {"id": 101, "name": "Book", "price": 5},
    {"id": 102, "name": "Pen", "price": 2},
    {"id": 103, "name": "Bag", "price": 20}
]

المطلوب:

  1. ابحث عن المنتج الذي رقمه 102.
  2. اطبع اسم المنتج وسعره.
  3. إذا لم يوجد المنتج، اطبع رسالة المنتج غير موجود.
  4. حوّل الحل إلى دالة باسم find_product_by_id.

حل مختصر للتدريب

def find_product_by_id(products, product_id):
    for product in products:
        if product["id"] == product_id:
            return product

    return None


products = [
    {"id": 101, "name": "Book", "price": 5},
    {"id": 102, "name": "Pen", "price": 2},
    {"id": 103, "name": "Bag", "price": 20}
]

product = find_product_by_id(products, 102)

if product:
    print("المنتج:", product["name"])
    print("السعر:", product["price"])
else:
    print("المنتج غير موجود")

روابط داخلية مفيدة من بايثون العرب

مصادر خارجية مفيدة للتوسع

الخلاصة

البحث داخل List في Python مهارة أساسية ستستخدمها كثيرًا في البرامج العملية. إذا أردت معرفة هل العنصر موجود، استخدم in. وإذا أردت تنفيذ منطق خاص أو البحث داخل قائمة من القواميس، استخدم for. وإذا أردت موقع العنصر، استخدم index() بعد التأكد من وجوده.

تعلمنا أيضًا استخدام count() لمعرفة عدد التكرارات، واستخدام any() و all() لفحص الشروط، وطبقنا على البحث داخل قائمة من القواميس حسب id أو name. ومع التدريب ستصبح هذه الطرق طبيعية جدًا في كتابة برامج Python.

الخلاصة العملية: ابدأ بـ in للبحث البسيط، واستخدم for للبحث العملي، وحوّل البحث إلى دالة إذا كنت ستستخدمه أكثر من مرة. {alertSuccess}

أسئلة شائعة مع إجاباتها

كيف أبحث عن عنصر داخل List في Python؟

استخدم in إذا كنت تريد معرفة هل العنصر موجود، مثل "Ali" in names.

كيف أعرف موقع عنصر داخل List؟

استخدم index()، لكن افحص وجود العنصر أولًا حتى لا يظهر ValueError.

كيف أبحث داخل List تحتوي على Dictionaries؟

استخدم حلقة for، ثم افحص قيمة مفتاح معين داخل كل قاموس مثل student["id"] أو student["name"].

ما الفرق بين in و index؟

in يخبرك هل العنصر موجود أم لا، أما index() فيعطيك موقع العنصر داخل القائمة.

كيف أبحث عن كل العناصر التي تحقق شرطًا؟

استخدم for مع if وأضف العناصر المطابقة إلى قائمة جديدة، أو استخدم List Comprehension.

متى أستخدم any؟

استخدم any() عندما تريد معرفة هل يوجد عنصر واحد على الأقل يحقق شرطًا معينًا.

متى أستخدم all؟

استخدم all() عندما تريد التأكد أن كل العناصر تحقق شرطًا معينًا.

إرسال تعليق

أحدث أقدم