السلاسل النصية والحاويات الشامل
في الدروس السابقة، غطينا القوائم والصفوف والقواميس والمجموعات وطرق السلاسل النصية. الآن دعنا نجمعها معاً — باستخدام أكثر "التركيبات" شيوعاً لحل المشكلات الحقيقية. هذه التقنيات تُستخدم يومياً في البرمجة الاحترافية.
1. split() مع القوائم
split() يكسر سلسلة نصية إلى قائمة — الخطوة الأولى في معالجة البيانات:
# تحليل بيانات CSV
line = "Alice,25,Beijing,Engineer"
fields = line.split(",")
print(fields) # ['Alice', '25', 'Beijing', 'Engineer']
# تقسيم بالمسافات البيضاء (افتراضي)
text = "hello world python"
words = text.split()
print(words) # ['hello', 'world', 'python']
# حدد عدد التقسيمات
data = "2026-06-23-15-30-00"
parts = data.split("-", 3)
print(parts) # ['2026', '06', '23', '15-30-00']
مثال: تحليل ملف تهيئة (الصعوبة ⭐⭐)
# محاكاة تحليل ملف تهيئة
config_text = """
host=localhost
port=8080
debug=true
theme=dark
"""
# تقسيم بأسطر ← تقسيم بعلامة يساوي ← تخزين في قاموس
config = {}
for line in config_text.strip().split("\n"):
if "=" in line:
key, value = line.split("=", 1)
config[key.strip()] = value.strip()
print(config)
# {'host': 'localhost', 'port': '8080', 'debug': 'true', 'theme': 'dark'}
# قراءة التهيئة
print(f"Current host: {config.get('host', 'localhost')}")
print(f"Current port: {config.get('port', '80')}")
المخرجات:
{'host': 'localhost', 'port': '8080', 'debug': 'true', 'theme': 'dark'}
Current host: localhost
Current port: 8080
2. قوة join()
join() هو عكس split() — يدمج قائمة في سلسلة نصية:
# استخدام أساسي
words = ["Hello", "World", "Python"]
sentence = " ".join(words)
print(sentence) # Hello World Python
# دمج بفواصل
csv = ",".join(["Alice", "25", "Beijing"])
print(csv) # Alice,25,Beijing
# دمج بأسطر جديدة
lines = "\n".join(["First line", "Second line", "Third line"])
print(lines)
مزايا أداء join()
# ❌ غير موصى به — دمج السلاسل النصية في حلقة
result = ""
for i in range(1000):
result += str(i) + ","
# هذا يُنشئ 1000 كائن سلسلة مؤقت (السلاسل النصية غير قابلة للتعديل)
# ✅ موصى به — اجمع في قائمة + join()
parts = [str(i) for i in range(1000)]
result = ",".join(parts)
# دمج واحد، أكثر كفاءة بكثير
مثال: تنسيق جدول (الصعوبة ⭐⭐)
# استخدم join + شاملة قائمة لإخراج جدول منسق
headers = ["Name", "Age", "City"]
rows = [
["Alice", "25", "Beijing"],
["Bob", "30", "Shanghai"],
["Charlie", "22", "Guangzhou"],
]
# العنوان
print(" | ".join(headers))
print("-" * 25)
# صفوف البيانات
for row in rows:
print(" | ".join(row))
المخرجات:
Name | Age | City
─────────────────────────
Alice | 25 | Beijing
Bob | 30 | Shanghai
Charlie | 22 | Guangzhou
3. sorted() مع السلاسل النصية والقواميس
sorted() يعمل على أي كائن قابل للتكرار، وليس فقط القوائم:
# ترتيب سلسلة نصية — ترتيب أبجدي
text = "python"
sorted_chars = sorted(text)
print(sorted_chars) # ['h', 'n', 'o', 'p', 't', 'y']
print("".join(sorted_chars)) # hnopty — إعادة تجميع
# ترتيب قاموس — يرتب المفاتيح افتراضياً
d = {"banana": 3, "apple": 5, "cherry": 2}
sorted_keys = sorted(d)
print(sorted_keys) # ['apple', 'banana', 'cherry']
# ترتيب حسب القيمة
sorted_by_value = sorted(d.items(), key=lambda x: x[1])
print(sorted_by_value) # [('cherry', 2), ('banana', 3), ('apple', 5)]
# ترتيب مجموعة
s = {3, 1, 4, 1, 5, 9}
sorted_set = sorted(s)
print(sorted_set) # [1, 3, 4, 5, 9]
مثال: قاعدة ترتيب مخصصة (الصعوبة ⭐⭐)
# ترتيب أسماء الملفات حسب الجزء الرقمي
files = ["file_10.txt", "file_2.txt", "file_1.txt", "file_20.txt"]
# ترتيب عادي — ترتيب سلاسل نصية، "10" يأتي قبل "2" (لأن '1' < '2')
print(sorted(files))
# ترتيب حسب الجزء الرقمي — استخرج الرقم، حوّل إلى int، ثم رتّب
def extract_number(filename):
num_str = filename.split("_")[1].split(".")[0]
return int(num_str)
sorted_files = sorted(files, key=extract_number)
print(sorted_files)
4. enumerate() و zip()
هاتان الدالتان المدمجتان شائعتان جداً في العمل اليومي.
enumerate() — احصل على الفهرس أثناء التكرار
fruits = ["apple", "banana", "orange"]
# بدون enumerate — غير أنيق
for i in range(len(fruits)):
print(f"{i + 1}. {fruits[i]}")
# مع enumerate — أنيق
for i, fruit in enumerate(fruits, 1): # start=1 للعد من 1
print(f"{i}. {fruit}")
zip() — التكرار المتوازي على قوائم متعددة
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
cities = ["Beijing", "Shanghai", "Guangzhou"]
# تكرار على ثلاث قوائم في وقت واحد
for name, score, city in zip(names, scores, cities):
print(f"{name}: {score} points, from {city}")
المخرجات:
Alice: 85 points, from Beijing
Bob: 92 points, from Shanghai
Charlie: 78 points, from Guangzhou
مثال: تقرير درجات الطالب (الصعوبة ⭐⭐⭐)
# أنشئ تقريراً كاملاً باستخدام enumerate + zip
students = ["Alice", "Bob", "Charlie", "Diana"]
chinese = [85, 92, 78, 88]
math = [90, 85, 95, 80]
english = [78, 95, 82, 90]
print("=== Student Score Report ===")
print(f"{'Rank':<4}{'Name':<8}{'Chinese':<8}{'Math':<8}{'English':<8}{'Average':<8}")
# حساب المتوسطات
averages = [(c + m + e) / 3 for c, m, e in zip(chinese, math, english)]
# ترتيب حسب المتوسط تنازلياً
data = list(zip(students, chinese, math, english, averages))
data.sort(key=lambda x: x[4], reverse=True)
# الإخراج
for rank, (name, c, m, e, avg) in enumerate(data, 1):
print(f"{rank:<4}{name:<8}{c:<8}{m:<8}{e:<8}{avg:<8.1f}")
5. حالة معالجة بيانات شاملة
دعنا نطبق كل ما تعلمناه على سيناريو واقعي:
حالة: تحليل السجلات (الصعوبة ⭐⭐⭐)
# سجل خادم محاكى
log_data = """
2026-06-20 10:23:45 INFO User 1001 logged in
2026-06-20 10:25:12 ERROR Database connection timeout
2026-06-20 10:26:30 INFO User 1002 logged in
2026-06-20 10:27:45 WARN Disk usage 85%
2026-06-20 10:28:10 ERROR User 1001 request timeout
2026-06-20 10:29:00 INFO User 1001 logged out
"""
# 1. تقسيم بأسطر
lines = log_data.strip().split("\n")
# 2. تحليل كل إدخال سجل
parsed = []
for line in lines:
parts = line.split()
timestamp = f"{parts[0]} {parts[1]}"
level = parts[2]
message = " ".join(parts[3:])
parsed.append({"time": timestamp, "level": level, "msg": message})
# 3. عد حسب المستوى
level_count = {}
for entry in parsed:
level = entry["level"]
level_count[level] = level_count.get(level, 0) + 1
# 4. إخراج مرتب حسب المستوى
print("=== Log Statistics ===")
for level, count in sorted(level_count.items()):
print(f"{level}: {count} entries")
# 5. تصفية جميع الأخطاء
print("\n=== Error Details ===")
errors = [e for e in parsed if e["level"] == "ERROR"]
for e in errors:
print(f"[{e['time']}] {e['msg']}")
المخرجات:
=== Log Statistics ===
ERROR: 2 entries
INFO: 3 entries
WARN: 1 entry
=== Error Details ===
[2026-06-20 10:25:12] Database connection timeout
[2026-06-20 10:28:10] User 1001 request timeout
حالات الاستخدام الشائعة
- تحليل التهيئة:
split()بمحدد ← تخزين في قاموس. - تصدير البيانات: شاملة قائمة +
join()لتنسيق البيانات كـ CSV أو جداول. - تحليل السجلات: تقسيم بأسطر ← تحليل الحقول ← تخزين في قاموس ←
sorted()وشاملات للإحصائيات. - ضم جداول متعددة:
zip()للتكرار المتوازي لقوائم بيانات متعددة في سجلات كاملة. - الترتيب:
enumerate(sorted(...))لإنشاء نتائج مرتبة مرقمة.
❓ أسئلة شائعة
split() و split(" ")؟split() بدون وسائط يقسم على أي مسافة بيضاء (مسافات، أسطر جديدة، تبويبات) ويزيل السلاسل الفارغة تلقائياً. split(" ") يقسم فقط على المسافات المفردة؛ المسافات المتتالية تُنتج سلاسل فارغة. في معظم الحالات، split() بدون وسائط هو الخيار الأفضل.
⚠️ س:هل يتطلب join() أن تكون جميع العناصر في القائمة سلاسل نصية؟ ج:نعم. ",".join([1, 2, 3]) سيُسبب خطأ. حوّل الأرقام إلى سلاسل نصية أولاً: ",".join(str(x) for x in [1, 2, 3]) أو استخدم str() في شاملة قائمة.
س:ماذا يحدث عندما يعالج zip() قوائم بأطوال مختلفة؟ ج:zip() يتوقف عند أقصر قائمة. إذا كانت إحدى القوائم الثلاث تحتوي على عنصرين فقط، zip() يُنتج فقط زوجين. للتبطين بـ None لأطول قائمة، استخدم itertools.zip_longest().📖 ملخص
split()يكسر سلسلة نصية إلى قائمة؛ بدون وسائط، يقسم على المسافات البيضاء ويزيل الفارغ تلقائياًjoin()يدمج قائمة في سلسلة نصية؛ الطريقة المفضلة لدمج السلاسل النصية (أكثر كفاءة من+=)sorted()يعمل على أي كائن قابل للتكرار — سلاسل نصية، قواميس، مجموعاتenumerate()يحصل على الفهرس أثناء التكرار؛ معاملstartيحدد قيمة البدايةzip()يتكرر بالتوازي على قوائم متعددة؛ رائع لدمج البيانات ذات الصلة- دمج هذه الأدوات يتيح معالجة بيانات فعالة في العالم الحقيقي
📝 تمارين
-
أساسي (الصعوبة ⭐): بالنظر إلى
s = "apple,banana,orange,grape"، استخدمsplit()لتقسيمها إلى قائمة، ثم استخدمjoin()لإخراج"apple | banana | orange | grape". -
متوسط (الصعوبة ⭐⭐): بالنظر إلى قائمتين
students = ["Alice", "Bob", "Charlie"]وscores = [85, 92, 78]، استخدمzip()وenumerate()لإخراج تقرير مرتب. -
تحدي (الصعوبة ⭐⭐⭐): اكتب "مُولّد CSV بسيط." بالنظر إلى قائمة من القوائم
data = [["Name", "Age", "City"], ["Alice", 25, "Beijing"], ["Bob", 30, "Shanghai"]]، أخرجها كسلسلة CSV (صفوف مفصولة بفواصل). تلميح: استخدمstr()في شاملة قائمة للأرقام،",".join()لكل صف،"\n".join()لجميع الصفوف.



