دوال الإحصاء
بعد أن تعرفنا على آلية فهرسة المحارف في السلاسل النصية، حان الوقت لمعاينة بعض الدوال التي تُحصي السلاسل النصية أو تعيد أرقام الفهارس. يمكننا أن نستفيد من ذلك بتحديد عدد المحارف التي نريد استقبالها من مدخلات المستخدم، أو لمقارنة السلاسل النصية. ولدى السلاسل النصية –كغيرها من أنواع البيانات– عدِّة دوال تُستخدم للإحصاء.
لننظر أولًا إلى الدالة len() التي تُعيد طول أيّ نوع متسلسل من البيانات، بما في ذلك string و lists و tuples و dictionaries.
لنطبع طول السلسلة النصية ss:
print(len(ss))
12
طول السلسلة النصية «Sammy Shark!» هو 12 محرفًا، بما في ذلك الفراغ وعلامة التعجب.
بدلًا من استخدام متغير، فلنحاول مباشرةً تمرير سلسلة نصية إلى الدالة len():
print(len("Let's print the length of this string."))
38
الدالة len() تُحصي العدد الإجمالي من المحارف في سلسلة نصية.
إذا أردنا إحصاء عدد مرات تكرار محرف أو مجموعة من المحارف في سلسلة نصية، فيمكننا استخدام الدالة str.count()، لنحاول إحصاء الحرف «a» في السلسلة النصية ss = "Sammy Shark!":
print(ss.count("a"))
2
يمكننا البحث عن محرفٍ آخر:
print(ss.count("s"))
0
صحيحٌ أنَّ الحرف «S» قد ورد في السلسلة النصية، إلا أنَّه من الضروري أن تبقي بذهنك أنَّ بايثون حساسةٌ لحالة الأحرف، فلو أردنا البحث عن حروفٍ معيّنة بغض النظر عن حالتها، فعلينا حينها استخدام الدالة str.lower() لتحويل حروف السلسلة النصية إلى حروفٍ صغيرة أولًا. يمكنك قراءة المزيد من المعلومات عن دالة str.lower() في درس «مقدمة إلى دوال التعامل مع السلاسل النصية في بايثون 3»
لنحاول استخدام الدالة str.count() مع سلسلة من المحارف:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
الناتج هو 3، حيث تتواجد مجموعة المحارف «likes» ثلاث مرات في السلسلة النصية الأصلية.
يمكننا أيضًا معرفة موقع الحرف أو مجموعة الحروف في السلسلة النصية، وذلك عبر الدالة str.find()، وسيُعاد موضع المحرف بناءً على رقم فهرسه.
يمكننا أن نعرف متى يقع أوّل حرف «m» في السلسلة النصية ss كالآتي:
print(ss.find("m"))
2
أوّل مرة يقع فيها الحرف «m» في الفهرس 2 من السلسلة «Sammy Shark!»، يمكنك أن تراجع بداية هذا الدرس لرؤية جدول يبيّن ارتباطات المحارف مع فهارسها في السلسلة السابقة.
لنرى الآن مكان أوّل ظهور لمجموعة المحارف «likes» في السلسلة likes:
print(likes.find("likes"))
6
أوّل مرة تظهر فيها السلسلة «likes» هي في الفهرس 6، أي مكان وجود الحرف l من likes.
ماذا لو أردنا أن نعرف موضع ثاني تكرار للكلمة «likes»؟ نستطيع فعل ذلك بتمرير معاملٍ ثانٍ إلى الدالة str.find() الذي سيجعلها تبدأ بحثها من ذاك الفهرس، فبدلًا من البحث من أوّل السلسلة النصية سنبحث انطلاقًا من الفهرس 9:
print(likes.find("likes", 9))
34
بدأ البحث في هذا المثال من الفهرس 9، وكانت أوّل مطابقة للسلسلة النصية «likes» عند الفهرس 34.
إضافةً إلى ذلك، يمكننا تحديد نهاية إلى مجال البحث بتمرير معامل ثالث. وكما عند تقسيم السلاسل النصية، يمكننا استخدام أرقام الفهارس السالبة للعد عكسيًا:
print(likes.find("likes", 40, -6))
64
يبحث آخر مثال عن موضع السلسلة النصية «likes» بين الفهرس 40 و -6، ولمّا كان المعامل الأخير هو رقم سالب، فسيبدأ العد من نهاية السلسلة الأصلية.
دوال الإحصاء مثل len() و str.count() و str.find() مفيدةٌ في تحديد طول السلسلة النصية وعدد حروفها وفهارس ورود محارف معيّنة فيها.
ستمنحنا القدرة على تحديد محارف بفهارسها أو تقسيم سلسلة نصية أو البحث فيها مرونةً عاليةً عند التعامل مع السلاسل النصية. ولأنَّ السلاسل النصية هي نوعٌ من أنواع البيانات المتسلسلة (كنوع البيانات list)، فيمكننا الوصول إلى عناصرها عبر فهارس خاصة.
بعد أن تعرفنا على آلية فهرسة المحارف في السلاسل النصية، حان الوقت لمعاينة بعض الدوال التي تُحصي السلاسل النصية أو تعيد أرقام الفهارس. يمكننا أن نستفيد من ذلك بتحديد عدد المحارف التي نريد استقبالها من مدخلات المستخدم، أو لمقارنة السلاسل النصية. ولدى السلاسل النصية –كغيرها من أنواع البيانات– عدِّة دوال تُستخدم للإحصاء.
لننظر أولًا إلى الدالة len() التي تُعيد طول أيّ نوع متسلسل من البيانات، بما في ذلك string و lists و tuples و dictionaries.
لنطبع طول السلسلة النصية ss:
print(len(ss))
12
طول السلسلة النصية «Sammy Shark!» هو 12 محرفًا، بما في ذلك الفراغ وعلامة التعجب.
بدلًا من استخدام متغير، فلنحاول مباشرةً تمرير سلسلة نصية إلى الدالة len():
print(len("Let's print the length of this string."))
38
الدالة len() تُحصي العدد الإجمالي من المحارف في سلسلة نصية.
إذا أردنا إحصاء عدد مرات تكرار محرف أو مجموعة من المحارف في سلسلة نصية، فيمكننا استخدام الدالة str.count()، لنحاول إحصاء الحرف «a» في السلسلة النصية ss = "Sammy Shark!":
print(ss.count("a"))
2
يمكننا البحث عن محرفٍ آخر:
print(ss.count("s"))
0
صحيحٌ أنَّ الحرف «S» قد ورد في السلسلة النصية، إلا أنَّه من الضروري أن تبقي بذهنك أنَّ بايثون حساسةٌ لحالة الأحرف، فلو أردنا البحث عن حروفٍ معيّنة بغض النظر عن حالتها، فعلينا حينها استخدام الدالة str.lower() لتحويل حروف السلسلة النصية إلى حروفٍ صغيرة أولًا. يمكنك قراءة المزيد من المعلومات عن دالة str.lower() في درس «مقدمة إلى دوال التعامل مع السلاسل النصية في بايثون 3»
لنحاول استخدام الدالة str.count() مع سلسلة من المحارف:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
الناتج هو 3، حيث تتواجد مجموعة المحارف «likes» ثلاث مرات في السلسلة النصية الأصلية.
يمكننا أيضًا معرفة موقع الحرف أو مجموعة الحروف في السلسلة النصية، وذلك عبر الدالة str.find()، وسيُعاد موضع المحرف بناءً على رقم فهرسه.
يمكننا أن نعرف متى يقع أوّل حرف «m» في السلسلة النصية ss كالآتي:
print(ss.find("m"))
2
أوّل مرة يقع فيها الحرف «m» في الفهرس 2 من السلسلة «Sammy Shark!»، يمكنك أن تراجع بداية هذا الدرس لرؤية جدول يبيّن ارتباطات المحارف مع فهارسها في السلسلة السابقة.
لنرى الآن مكان أوّل ظهور لمجموعة المحارف «likes» في السلسلة likes:
print(likes.find("likes"))
6
أوّل مرة تظهر فيها السلسلة «likes» هي في الفهرس 6، أي مكان وجود الحرف l من likes.
ماذا لو أردنا أن نعرف موضع ثاني تكرار للكلمة «likes»؟ نستطيع فعل ذلك بتمرير معاملٍ ثانٍ إلى الدالة str.find() الذي سيجعلها تبدأ بحثها من ذاك الفهرس، فبدلًا من البحث من أوّل السلسلة النصية سنبحث انطلاقًا من الفهرس 9:
print(likes.find("likes", 9))
34
بدأ البحث في هذا المثال من الفهرس 9، وكانت أوّل مطابقة للسلسلة النصية «likes» عند الفهرس 34.
إضافةً إلى ذلك، يمكننا تحديد نهاية إلى مجال البحث بتمرير معامل ثالث. وكما عند تقسيم السلاسل النصية، يمكننا استخدام أرقام الفهارس السالبة للعد عكسيًا:
print(likes.find("likes", 40, -6))
64
يبحث آخر مثال عن موضع السلسلة النصية «likes» بين الفهرس 40 و -6، ولمّا كان المعامل الأخير هو رقم سالب، فسيبدأ العد من نهاية السلسلة الأصلية.
دوال الإحصاء مثل len() و str.count() و str.find() مفيدةٌ في تحديد طول السلسلة النصية وعدد حروفها وفهارس ورود محارف معيّنة فيها.
ستمنحنا القدرة على تحديد محارف بفهارسها أو تقسيم سلسلة نصية أو البحث فيها مرونةً عاليةً عند التعامل مع السلاسل النصية. ولأنَّ السلاسل النصية هي نوعٌ من أنواع البيانات المتسلسلة (كنوع البيانات list)، فيمكننا الوصول إلى عناصرها عبر فهارس خاصة.