كيفية فرز قائمة أبجديا في بايثون

ماذا لو كان لديك قائمة سلاسل (عناصر نصية) وتحتاج إلى ترتيبها أبجديًا؟ سنوضح لك في هذه المقالة كيفية فرز قائمة في بايثون.

تقوم خوارزمية الفرز بوضع عناصر القائمة في ترتيب معين. إنها تساعد في تقليل تعقيد المشكلة ويمكنها أيضًا تحسين الخوارزميات الأخرى.

نظرًا لتعقيده، يعد الفرز أحد أهم المشكلات في علوم الكمبيوتر. باختصار، يمكن تعريف الفرز بأنه ترتيب العناصر في تسلسل مرتب. على الرغم من أن فكرة فرز الخوارزميات تبدو بسيطة في البداية، إلا أنها ليست كذلك؛ بدأ البحث عنه منذ 70 عامًا.

إن كتابة دالة فرز جيدة بنفسك ليس بالأمر السهل. لحسن الحظ، تأتي بايثون مع دوال الفرز المضمنة. تستكشف هذه المقالة كيفية استخدام sort() و sorted() للفرز أبجديًا في بايثون.

مثال مختصر للفرز في بايثون

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

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

قد ترغب في الرجوع إلى مصطلحات بايثون التي يجب على المبتدئين معرفتها الجزء 1 والجزء 2 لمزيد من المعلومات. أخيرًا، أشجعك على التسجيل في دورة PYTHON DATA STRUCTURE التفاعلية حتى تتمكن من ممارسة هذه المهارات الجديدة.

العودة إلى فرز بايثون. إليك الكود لفرز بسيط:

>>> mylist = ["world", "pyarabic.com", "pineapple", "bicycle"]
>>> sorted_list = sorted(mylist)
>>> print(sorted_list)
['bicycle', 'pineapple', 'pyarabic.com', 'world']

أعلاه، تحتوي القائمة mylist على السلاسل “world” و”pyarabic.com” و”pineapple” و”bicycle” بدون ترتيب معين. نريد فرز هذه القائمة وتخزينها كمتغير جديد يسمى sorted_list. في لغة بايثون، يعد فرز القائمة أبجديًا أمرًا سهلاً مثل تمرير قائمة من السلاسل إلى التابع sorted(). يتم فرز السلاسل بالترتيب الأبجدي بناءً على الحرف الأول (A-Z). ومع ذلك، فإن الكلمات التي تبدأ بأحرف كبيرة تأتي قبل الكلمات التي تبدأ بأحرف صغيرة. (ملاحظة: هذا يعني أنه سيتم إدراج “Zebra” قبل “apple” لأن “Zebra” يبدأ بحرف كبير.)

الآن بعد أن فهمنا ما هو الفرز، يمكننا أن نبدأ مع الكود!

فرز قائمة أبجديًا في بايثون باستخدام sort()

أولاً، لنرتب القائمة أبجديًا في لغة بايثون باستخدام التابع sort(). بشكل افتراضي، سيضع التابعsort() ‎ العناصر بترتيب تصاعدي (A–Z).

لنأخذ نفس القائمة كما في السابق:

>>> mylist = ["world", "pyarabic.com", "pineapple", "bicycle"]
>>> mylist.sort()
>>> print(mylist)
['bicycle', 'pineapple', 'pyarabic.com', 'world']

ومع ذلك، لاحظ أن التابع sort() سيقوم مباشرة بتعديل القائمة الأولية للعناصر وأنه لن يكون من الممكن التراجع عن أي تغييرات.

إذا كنت تريد فرز العناصر بترتيب تنازلي (Z–A)، فيمكنك القيام بذلك عن طريق تعيين المعلمة العكسية فيsort() ‎ على أنها True أو False.

>>> mylist = ["world", "Pyarabic.com", "pineapple", "bicycle"]
>>> mylist.sort(reverse=True)
>>> print(mylist)
['world', 'pineapple', 'bicycle', 'Pyarabic.com']

وها قد بدأنا! يتم الآن فرز mylist بترتيب تنازلي.

من المهم ملاحظة أن دالةsort() ‎ تقوم بالفرز في مكانها، أي دون الحاجة إلى أي مساحة إضافية. وفقا لويكيبيديا:

تعمل الخوارزمية الموضعية على تحويل بيانات الإدخال دون الحاجة إلى هياكل مساعدة.

الفكرة وراء الخوارزمية الموضعية هي كفاءة المساحة. بمعنى آخر، نريد استخدام الحد الأدنى من موارد الأجهزة لإكمال المهمة. بشكل أساسي، يتم إنتاج الإخراج في نفس مساحة الذاكرة التي تحتوي على الإدخال؛ يتم تحويل البيانات تباعا في المكان. يؤدي هذا إلى تجنب استخدام ضعف مساحة التخزين عن طريق الاحتفاظ بنسخة من الإدخال.

لذا، هل يجب عليك استخدام sort()؟

إذا كنت تعمل مع بيانات مهمة وكان هناك احتمال أنك ستحتاج إلى استرداد البيانات الأصلية في المستقبل، فإن عملية sort() ليست الخيار الأفضل لأنها تعدل القائمة الأصلية.

من ناحية أخرى، إذا كانت البيانات عبارة عن نسخة أو بيانات عمل غير مهمة، فيمكن أن يكون sort() خيارًا جيدًا. خيار آخر هو استخدام sorted() بدلاً من ذلك.

فرز قائمة أبجديًا في بايثون باستخدام sorted()

لدى بايثون أيضًا الدالةsorted() ‎، والتي استخدمناها في المثال الافتتاحي. على عكس الدالة sort()‎، لا تقوم هذه الطريقة بتعديل القائمة الأصلية؛ تقوم بإرجاع قائمة جديدة بنفس محتوى القائمة الأصلية ولكن بالترتيب الأبجدي. على سبيل المثال:

>>> new_list = ["Python", "welcome", "hello", "programming", "sorting", "zebra", "alligator"]
>>> sort_newlist = sorted(new_list)
>>> print(sort_newlist)
['Python', 'alligator', 'hello', 'programming', 'sorting', 'welcome', 'zebra']

هنا، يتم تخزين القائمة الجديدة التي تم فرزها في متغير يسمى sort_newlist. يمكننا دائمًا الوصول إلى متغير new_list.

على غرار الدالة sort()‎، تحتوي الدالة sorted()‎ أيضًا على وسيطة reverse تكون False افتراضيًا. فلنضبطها على True لإعادة ترتيب new_list بترتيب تنازلي:

>>> new_list = ["Python", "welcome", "hello", "programming", "sorting", "zebra", "alligator"]
>>> sort_newlist = sorted(new_list, reverse=True)
>>> print(sort_newlist)
['zebra', 'welcome', 'sorting', 'programming', 'hello', 'alligator', 'Python']

فرز قائمة أبجديًا في بايثون باستخدام المفتاح

بشكل افتراضي، يستخدم sort() و sorted() عامل المقارنة <. يمكنك تعديل الترتيب المستخدم عند الفرز عن طريق تحديد الوسيطة الرئيسية.

في السابق، رأينا أن sort() و sorted() يعطيان الأولوية للسلاسل النصية الكبيرة. ومع ذلك، قد نرغب في الفرز غير الحساس لحالة الأحرف. يمكن القيام بذلك عن طريق تعيين الوسيطة الرئيسية إلى str.lower (الذي يحول كافة السلاسل إلى أحرف صغيرة). لاستخدام هذا النوع من الفرز على بياناتك، ستحتاج إلى دالة أو أي دالة أخرى قابلة للاستدعاء تأخذ وسيطة واحدة وترجع المفتاح المستخدم للفرز. هذه التقنية سريعة لأن الوظيفة الرئيسية يتم استدعاؤها مرة واحدة فقط لكل إدخال.

>>> mylist = ["world", "Pyarabic.com", "pineapple", "bicycle", "Anaconda", "Jupyter"]
>>> mylist.sort(key=str.lower)
>>> print(mylist)
['Anaconda', 'bicycle', 'Jupyter', 'pineapple', 'Pyarabic.com', 'world']

وبالمثل مع sorted():

>>> mylist = ["world", "Pyarabic.com", "pineapple", "bicycle", "Anaconda", "Jupyter"]
>>> sort_mylist = sorted(mylist, key=str.lower)
>>> print(sort_mylist)
['Anaconda', 'bicycle', 'Jupyter', 'pineapple', 'Pyarabic.com', 'world']

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

>>> people = [('Anna', 'New York', 'Data Analyst'),('Chris', 'Berlin', 'Software Developer'),('Nancy', 'Toronto', 'Data Scientist')]
>>> sorted_people = sorted(people, key=lambda x: x[1])
>>> print(sorted_people)
[('Chris', 'Berlin', 'Software Developer'), ('Anna', 'New York', 'Data Analyst'), ('Nancy', 'Toronto', 'Data Scientist')]

الإخراج عبارة عن قائمة مرتبة أبجديًا بناءً على المدينة لأن x[1] يصل إلى العنصر الثاني من المجموعة (أي اسم المدينة).

دعونا نلقي نظرة على المثال أعلاه، ولكن هذه المرة باستخدام sort():

>>> people = [('Anna', 'New York', 'Data Analyst'),('Chris', 'Berlin', 'Software Developer'),('Nancy', 'Toronto', 'Data Scientist')]
>>> people.sort(key=lambda x: x[1])
>>> print(people)
[('Chris', 'Berlin', 'Software Developer'), ('Anna', 'New York', 'Data Analyst'), ('Nancy', 'Toronto', 'Data Scientist')]

والنتيجة هي نفسها، ولكن لم يعد بإمكاننا الوصول إلى قائمة الأشخاص الأصلية بعد الآن.

استقرار خوارزميات الفرز في بايثون

وأخيرًا، يتم ضمان استقرار sort() وsorted(). يعني الفرز المستقر أن كائنين لهما مفاتيح متطابقة يظهران بنفس الترتيب في المخرجات التي تم فرزها كما هو الحال في الإدخال الأصلي. بمعنى آخر، يضمن الفرز المستقر الحفاظ على الترتيب الأصلي للبيانات بنفس الترتيب في الإخراج.

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

تعد خوارزميات الفرز المستقرة ضرورية للحفاظ على ترتيب العناصر المتساوية. ولكي يتم اعتبارها كذلك، يجب ألا تغير الترتيب النسبي للعناصر التي تتم مقارنتها. يساعد هذا في الفرز، على سبيل المثال، إذا كنا بحاجة إلى القيام بذلك في مسارات متعددة (مثل الفرز حسب المدينة والمهنة) أو شيء من هذا القبيل.

من ناحية أخرى، يمكن للفرز غير المستقر خلط عنصر واحد أثناء الفرز بواسطة عنصر آخر. في هذه الحالة، قد يؤدي الفرز حسب المدينة إلى تبديل ترتيب الأسماء، مما يؤدي إلى ظهور قائمة حيث يتم فرز الأشخاص حسب المدينة ولكن داخل المدينة لا يتم فرزهم حسب الاسم، على الرغم من أنه تم فرزهم في الأصل حسب الاسم.

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

هل أنت مستعد لممارسة الفرز في بايثون؟

استكشفت هذه المقالة كيفية فرز القائمة أبجديًا في بايثون. اكتشفنا كيفية استخدام sort() و sorted() للفرز في بايثون وكيف يختلفان عن بعضهما البعض. لقد غطينا أيضًا لفترة وجيزة استقرار خوارزميات الفرز في بايثون.

الآن بعد أن أصبحت لديك معرفة قوية حول الفرز في لغة Python، يمكنك المضي قدمًا وتنفيذ الحلول الخاصة بك من خلال اللعب بمقتطفات التعليمات البرمجية أعلاه.

وأخيرًا، لا تنس التحقق من الخوارزميات التفاعلية المدمجة في دورة لغة بايثون. يمنحك تدريبًا عمليًا قويًا في البرمجة باستخدام Python. يمكنك أيضًا زيارة LEARNPYTHON.COM لمعرفة المزيد حول دوراتنا في لغة Python.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading