في الدروس السابقة من سلسلة بايثون بالمثال تعاملنا مع القوائم List بطرق عملية مثل فلترة العناصر وترتيبها. واليوم سنأخذ مهارة جديدة ومهمة جدًا: البحث داخل List في Python.
البحث داخل القائمة من أكثر العمليات التي ستستخدمها في البرامج اليومية. قد تريد معرفة هل اسم معين موجود في قائمة طلاب، أو هل رقم منتج موجود في قائمة، أو تريد البحث عن طالب داخل قائمة من القواميس حسب رقمه أو اسمه. لذلك هذا الدرس مهم جدًا للمبتدئين لأنه ينقلك من مجرد حفظ أوامر القوائم إلى استخدامها في سيناريوهات عملية.
في هذا الدرس من بايثون العرب سنتعلم البحث داخل List باستخدام in، واستخدام for، واستخدام index() و count()، ثم سنطبق على البحث داخل قائمة تحتوي على قواميس Dictionaries، وهي حالة شائعة جدًا في المشاريع.
{getToc} $title={محتوى المقال}
الفكرة ببساطة: إذا أردت معرفة هل العنصر موجود فقط، استخدمin. وإذا أردت تنفيذ عملية عند العثور عليه، استخدمfor. وإذا أردت موقعه داخل القائمة، استخدمindex()بحذر. {alertInfo}
ما معنى البحث داخل List في Python؟
البحث داخل القائمة يعني فحص عناصر القائمة لمعرفة هل تحتوي على عنصر معين، أو إيجاد موقع هذا العنصر، أو استخراج عناصر تطابق شرطًا معينًا.
مثال بسيط:
names = ["Ali", "Sara", "Omar", "Mona"]
قد نريد أن نعرف:
- هل الاسم
"Sara"موجود؟ - في أي موقع يوجد الاسم
"Omar"؟ - هل توجد أسماء تبدأ بحرف معين؟
- كم مرة يتكرر عنصر معين؟
- كيف نبحث داخل قائمة من بيانات الطلاب؟
الطريقة الأولى: البحث باستخدام in
أسهل طريقة للبحث داخل قائمة هي استخدام العامل in. هذه الطريقة تجيبك بنعم أو لا: هل العنصر موجود داخل القائمة؟
names = ["Ali", "Sara", "Omar", "Mona"]
if "Sara" in names:
print("الاسم موجود")
else:
print("الاسم غير موجود")
الناتج:
الاسم موجود
هذه الطريقة واضحة ومناسبة عندما تريد فقط معرفة وجود العنصر.
البحث عن رقم داخل 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
إيقاف البحث عند العثور على العنصر باستخدام 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
البحث عن طالب بالاسم داخل قائمة قواميس
يمكن البحث بالاسم بنفس الطريقة:
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}
]
المطلوب:
- ابحث عن المنتج الذي رقمه
102. - اطبع اسم المنتج وسعره.
- إذا لم يوجد المنتج، اطبع رسالة
المنتج غير موجود. - حوّل الحل إلى دالة باسم
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 للمبتدئين
- بايثون بالمثال 11: فلترة عناصر List في Python باستخدام for و if
- بايثون بالمثال 12: ترتيب عناصر List في Python باستخدام sort و sorted
- شرح Dictionary في Python للمبتدئين
- حل خطأ KeyError في Python عند التعامل مع Dictionary
مصادر خارجية مفيدة للتوسع
- توثيق Python الرسمي حول Lists
- توثيق Python الرسمي لأنواع Sequence مثل List
- توثيق Python الرسمي للدالة any
- توثيق Python الرسمي للدالة all
الخلاصة
البحث داخل 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() عندما تريد التأكد أن كل العناصر تحقق شرطًا معينًا.



