أساسيات القوائم
في الدروس السابقة، المتغيرات كانت تحمل قيمة واحدة فقط. لكن في الحياة الواقعية، نادراً ما تأتي البيانات كأفراد — عربات التسوق بها عناصر متعددة، لوحات الصدارة بها إدخالات متعددة، المقالات بها فقرات متعددة. القوائم مصممة لتحمل "مجموعة من البيانات." إنها هيكل البيانات الأكثر مرونة واستخداماً في بايثون.
1. ما هي القائمة
تُعرّف القائمة بأقواس مربعة []، عناصرها مفصولة بفواصل. يمكن أن تحمل عناصر من أنواع مختلفة:
# قائمة من الأعداد الصحيحة
numbers = [1, 2, 3, 4, 5]
# قائمة من السلاسل النصية
fruits = ["apple", "banana", "orange"]
# أنواع مختلطة
mixed = [1, "hello", True, 3.14]
# قائمة فارغة
empty = []
print(numbers) # [1, 2, 3, 4, 5]
print(fruits) # ['apple', 'banana', 'orange']
print(empty) # []
2. الوصول بالفهرس
فهرسة القوائم تعمل تماماً مثل السلاسل النصية — تبدأ من 0، وتدعم الفهارس السالبة:
fruits = ["apple", "banana", "orange", "grape", "watermelon"]
# موجب: يبدأ من 0
print(fruits[0]) # apple
print(fruits[2]) # orange
print(fruits[4]) # watermelon
# سالب: يبدأ من -1 (آخر عنصر)
print(fruits[-1]) # watermelon
print(fruits[-2]) # grape
print(fruits[-5]) # apple
الوصول إلى فهرس خارج النطاق يُسبب خطأ:
# print(fruits[10]) # IndexError: list index out of range
مثال: الحصول على معلومات عناصر القائمة (الصعوبة ⭐)
# بالنظر إلى قائمة الطلاب
students = ["Alice", "Bob", "Charlie", "David", "Eve"]
# الأول والأخير
first = students[0]
last = students[-1]
print(f"First student: {first}")
print(f"Last student: {last}")
# الأول ثلاثة
top3 = students[:3] # تقطيع
print(f"Top 3: {top3}")
# طول القائمة
count = len(students)
print(f"Total students: {count}")
3. عمليات CRUD للقوائم
القوائم قابلة للتعديل — يمكنك تعديلها في المكان (على عكس السلاسل النصية).
إضافة عناصر
# append() — أضف إلى النهاية
cities = ["Beijing", "Shanghai"]
cities.append("Guangzhou")
print(cities) # ['Beijing', 'Shanghai', 'Guangzhou']
# insert() — أدخل في موضع محدد
cities.insert(1, "Shenzhen")
print(cities) # ['Beijing', 'Shenzhen', 'Shanghai', 'Guangzhou']
# extend() — ادمج قائمة أخرى
more_cities = ["Hangzhou", "Chengdu"]
cities.extend(more_cities)
print(cities) # ['Beijing', 'Shenzhen', 'Shanghai', 'Guangzhou', 'Hangzhou', 'Chengdu']
إزالة عناصر
# pop() — أزل وأرجع العنصر في موضع (افتراضي آخر عنصر)
cities = ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
last = cities.pop() # أزل وأرجع الأخير
print(f"Removed: {last}") # Shenzhen
print(cities) # ['Beijing', 'Shanghai', 'Guangzhou']
first = cities.pop(0) # أزل الأول
print(f"Removed: {first}") # Beijing
print(cities) # ['Shanghai', 'Guangzhou']
# remove() — أزل أول قيمة تطابق
cities = ["Beijing", "Shanghai", "Guangzhou", "Shanghai"]
cities.remove("Shanghai") # يزيل فقط أول "Shanghai"
print(cities) # ['Beijing', 'Guangzhou', 'Shanghai']
# clear() — أزل جميع العناصر
cities.clear()
print(cities) # []
تعديل عناصر
scores = [60, 70, 80, 90]
scores[2] = 85 # غيّر الثالث إلى 85
print(scores) # [60, 70, 85, 90]
البحث عن عناصر
# in — تحقق مما إذا كان العنصر موجوداً
fruits = ["apple", "banana", "orange"]
print("apple" in fruits) # True
print("grape" in fruits) # False
# index() — ابحث عن الموضع
print(fruits.index("banana")) # 1
# print(fruits.index("grape")) # ValueError!
index() على عنصر غير موجود يُثير خطأ. استخدم in أولاً للتحقق بأمان.
مثال: إدارة عربة التسوق (الصعوبة ⭐⭐)
# محاكاة عربة تسوق بقائمة
cart = []
# أضف عناصر
cart.append("apple")
cart.append("milk")
cart.append("bread")
cart.append("apple") # التكرار مسموح
print(f"Cart: {cart}")
# تحقق من الكمية
print(f"Total items: {len(cart)}")
# تعديل — غيّر أول apple إلى "apple (2-pack)"
cart[0] = "apple (2-pack)"
print(f"After update: {cart}")
# أزل آخر عنصر
removed = cart.pop()
print(f"Removed: {removed}")
print(f"Final cart: {cart}")
المخرجات:
Cart: ['apple', 'milk', 'bread', 'apple']
Total items: 4
After update: ['apple (2-pack)', 'milk', 'bread', 'apple']
Removed: apple
Final cart: ['apple (2-pack)', 'milk', 'bread']
4. الترتيب والعكس
numbers = [3, 1, 4, 1, 5, 9, 2]
# sort() — ترتيب في المكان (يعدل القائمة الأصلية)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sort(reverse=True) — تنازلي
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# reverse() — عكس الترتيب
numbers.reverse()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sorted() — يُرجع قائمة جديدة، لا يعدل الأصلية
numbers = [3, 1, 4, 1, 5]
sorted_nums = sorted(numbers)
print(sorted_nums) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5] (لم تتغير)
sort() مقابل sorted()؟ إذا كنت لا تحتاج الترتيب الأصلي، استخدم sort() (أسرع، أكثر كفاءة في الذاكرة). إذا كنت بحاجة للحفاظ على الترتيب الأصلي، استخدم sorted().
5. تقطيع القوائم
التقطيع يعمل بنفس طريقة السلاسل النصية: list[start:end:step]
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:6]) # [2, 3, 4, 5]
print(nums[:4]) # [0, 1, 2, 3] — أول 4
print(nums[6:]) # [6, 7, 8, 9] — من 6 إلى النهاية
print(nums[::2]) # [0, 2, 4, 6, 8] — كل عنصر آخر
print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] — معكوس
التقطيع يدعم أيضاً الإسناد — ميزة فريدة للقوائم:
nums = [0, 1, 2, 3, 4, 5]
# استبدال شريحة
nums[1:4] = [10, 20, 30]
print(nums) # [0, 10, 20, 30, 4, 5]
# حذف شريحة
nums[1:4] = []
print(nums) # [0, 4, 5]
مثال: الترقيم الصفحي بالتقطيع (الصعوبة ⭐⭐)
# عرض مقسم إلى صفحات — 3 عناصر في كل صفحة
items = ["Item A", "Item B", "Item C", "Item D", "Item E", "Item F", "Item G"]
page_size = 3
total_pages = (len(items) + page_size - 1) // page_size
for page in range(total_pages):
start = page * page_size
end = start + page_size
page_items = items[start:end]
print(f"Page {page + 1}: {page_items}")
المخرجات:
Page 1: ['Item A', 'Item B', 'Item C']
Page 2: ['Item D', 'Item E', 'Item F']
Page 3: ['Item G']
6. القوائم المتداخلة
عناصر القائمة يمكن أن تكون هي نفسها قوائم — وهذا يُسمى قائمة متداخلة (أو قائمة ثنائية الأبعاد).
# "مصفوفة" 3×4
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# الوصول: أولاً الصف، ثم العمود
print(matrix[0]) # [1, 2, 3, 4] — الصف الأول
print(matrix[1][2]) # 7 — الصف الثاني، العمود الثالث
print(matrix[2][0]) # 9 — الصف الثالث، العمود الأول
مثال: جدول درجات الطلاب (الصعوبة ⭐⭐⭐)
# خزّن درجات الطلاب في قائمة متداخلة
# كل صف: [الاسم، اللغة، الرياضيات، الإنجليزية]
scores = [
["Alice", 85, 92, 78],
["Bob", 90, 88, 95],
["Charlie", 76, 85, 82],
]
# احسب وأخرج متوسط كل طالب
for student in scores:
name = student[0]
avg = (student[1] + student[2] + student[3]) / 3
print(f"{name}: Average {avg:.1f}")
# أخرج جميع درجات الرياضيات
print("Math scores:")
for student in scores:
print(f" {student[0]}: {student[1]}")
المخرجات:
Alice: Average 85.0
Bob: Average 91.0
Charlie: Average 81.0
Math scores:
Alice: 85
Bob: 90
Charlie: 76
حالات الاستخدام الشائعة
- قائمة المهام:
append()لإضافة مهام،pop()لإكمال وإزالة،sort()حسب الأولوية. - طابور: أولاً داخلاً أولاً خارجاً —
append()للإدراج،pop(0)للإزالة. - جمع البيانات:
append()للنتائج في حلقة، تحليل الكل مرة واحدة. - الترقيم الصفحي: شريحة
list[start:end]لترقيم البيانات. - عمليات المصفوفات: قوائم ثنائية الأبعاد لبيانات جدولية، الوصول بفهرس الصف والعمود.
❓ أسئلة شائعة
len() و in.
⚠️ س:ما الفرق بين append() و extend()؟ ج:append() تضيف الوسيطة بأكملها كعنصر واحد — إذا مررت قائمة، تصبح قائمة متداخلة. extend() تضيف كل عنصر من الوسيطة بشكل فردي. a = [1,2]; a.append([3,4]) يعطي [1,2,[3,4]]، بينما a.extend([3,4]) يعطي [1,2,3,4].
س:ماذا يحدث إذا حاولت remove() عنصراً غير موجود؟ ج:يُثير ValueError. لذا تحقق باستخدام in أولاً: if "xxx" in my_list: my_list.remove("xxx"). أو استخدم قائمة شاملة لإنشاء قائمة جديدة مفلترة: new_list = [x for x in my_list if x != "xxx"] (سنتعلم هذا في الدرس التالي).📖 ملخص
- القوائم تستخدم
[]، مرتبة، قابلة للتعديل، تسمح بالتكرار، يمكن أن تحمل أنواعاً مختلفة - الفهرسة تبدأ من 0، تدعم الفهارس السالبة؛ التقطيع يعمل مثل السلاسل النصية
- إضافة:
append()في النهاية،insert()في موضع،extend()للدمج - إزالة:
pop()يُرجع العنصر المزال،remove()بالقيمة،clear()الكل - تعديل:
list[index] = new_value - تحقق:
inللوجود،index()للموضع - ترتيب:
sort()في المكان،sorted()يُرجع قائمة جديدة - القوائم المتداخلة تتيح هياكل بيانات ثنائية الأبعاد، الوصول عبر
list[row][col]
📝 تمارين
-
أساسي (الصعوبة ⭐): أنشئ قائمة من 5 أفلام تحبها. استخدم
append()لإضافة فيلم جديد،pop()لإزالة الأخير،sort()أبجدياً، ثم أخرج طول القائمة. -
متوسط (الصعوبة ⭐⭐): بالنظر إلى
numbers = [23, 45, 12, 67, 34, 89, 5, 18]، ابحث وأخرج القيمة القصوى، الدنيا، المجموع، والمتوسط. تلميح: استخدم الدوال المدمجة مثلmax()،min()،sum()،len(). -
تحدي (الصعوبة ⭐⭐⭐): اكتب "مدير قائمة المهام." استخدم قائمة لتخزين المهام. ادعم:
add:Buy milk،done:2(أزل بالرقم)،list(أظهر الكل). استخدمwhile Trueلاستقبال الأوامر باستمرار؛exitللخروج. تلميح: استخدمsplit(":")لتحليل الأوامر.



