Python قائمة الفرز () مع الأمثلة

⚡ ملخص ذكي

Python تقوم الدالة list sort() بترتيب عناصر القائمة في مكانها، تصاعديًا بشكل افتراضي أو تنازليًا من خلال المعامل العكسي، بينما تقوم دالة المفتاح الاختيارية بالفرز وفقًا لمعايير مخصصة مثل الطول أو حقول الصفوف أو الدوال المعرفة من قبل المستخدم.

  • 🔘 بناء الجملة: تقبل دالة sort() معلمات اختيارية للمفتاح والعكس، وتقوم بتعديل القائمة الأصلية دون إنشاء نسخة منها.
  • ☑️ مراقبة الطلبات: يؤدي تعيين المعامل العكسي إلى "صحيح" إلى فرز القيم من الأعلى إلى الأدنى بدلاً من الترتيب التصاعدي الافتراضي.
  • المعلمة الرئيسية: تقوم دالة رئيسية مثل len بفرز العناصر حسب قيمة مشتقة مثل طول السلسلة أو حقل tuple.
  • 🧪 فرز مقابل مُرتب: تقوم طريقة sort() بتغيير القائمة في مكانها وتعيد None، بينما تقوم sorted() بإعادة قائمة جديدة مع الاحتفاظ بالقائمة الأصلية.
  • 🛠️ معايير مخصصة: تتيح تعابير لامدا والدوال المعرفة من قبل المستخدم للدالة sort() ترتيب الصفوف والقواميس والصفوف المسماة حسب أي سمة مختارة.
  • 🤖 سير عمل الذكاء الاصطناعي: تقوم مسارات التعلم الآلي بفرز التنبؤات حسب النتيجة واختيار أفضل النتائج قبل الترتيب أو التقييم.

Python فرز القائمة ()

ما هي طريقة الفرز () في Python?

الدالة sort() في Python تساعد هذه الدالة في ترتيب قائمة تصاعديًا أو تنازليًا. ويمكن استخدامها لترتيب القوائم الرقمية، والصفوف، والنصوص. وهي لا تُنشئ قائمة جديدة، بل تُعدّل القائمة الأصلية أو تُرتّبها.

بناء جملة طريقة الفرز في Python

تتضمن دالة الفرز الصيغة التالية:

List.sort(key=…, reverse=…)

تحتوي دالة الفرز على معلَمَين اختياريين، وهما:

  • المفتاح: - يستخدم لفرز دالة بناءً على معيار الفرز.
  • Reverseتأخذ هذه الدالة القيمة إما "صحيح" أو "خطأ". إذا كانت القيمة "صحيح"، فإنها تقوم بترتيب القائمة تنازليًا.

فرز القائمة بترتيب تصاعدي باستخدام طريقة الفرز Python

In Python، تقوم وظيفة الفرز، افتراضيًا، بفرز أي قائمة بترتيب تصاعدي. تحتوي القائمة المُرتبة تصاعديًا على أدنى قيمة على الجانب الأيسر، وتأتي أعلى قيمة على الجانب الأيمن.

على سبيل المثال:

Python رمز:

base_list=["Google","Reliance","Guru99","Content","Syntax"]
base_list.sort()
print("the base list after sorting is",base_list)

الإخراج:

the base list after sorting is ['Content', 'Google', 'Guru99', 'Reliance', 'Syntax']

Code التفسير:

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

فرز القائمة بترتيب تنازلي

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

يتم تعيين المعلمة العكسية لوظيفة الفرز على أنها صحيحة للحصول على قائمة مرتبة بترتيب تنازلي.

لنلقِ نظرة على المثال التالي:

Python رمز:

base_list=[100,600,400,8000,50]
base_list.sort()
print("the base list after sorting is",base_list)
# Reverse Order
base_list.sort(reverse=True)
print("the base list after REVERSE sorting is",base_list)

الإخراج:

the base list after sorting is [50, 100, 400, 600, 8000]
the base list after REVERSE sorting is [8000, 600, 400, 100, 50]

ملاحظة: تأكد من أن تعيين كلمة "True" للمعلمة العكسية يبدأ بالحرف الكبير "T" لتجنب أي أخطاء في وقت التشغيل.

فرز قائمة من الصفوف باستخدام طريقة الفرز في Python

Python الصفوف هي مجموعات من العناصر غير القابلة للتغيير والتي تتبع تسلسلاً مرتبًا. Pythonيمكن استخدام دالة الفرز لفرز قائمة من الصف باستخدام دالة مخصصة وتعبير لامدا.

يمكن إنشاء دالة مخصصة بدون اسم، ويتم تمثيلها بتعبير لامدا. فيما يلي صيغة تعبير لامدا:

بناء الجملة:

Lambda arguments: expression

بناء الجملة أعلاه يعادل كود بايثون أدناه:

def name (arguments):
return expression

فيما يلي مثال على مجموعة بيانات ودالة مخصصة لتوضيح كيف تساعد دالة الفرز ذات المعلمات الرئيسية في فرز العناصر في مجموعة البيانات:

Python رمز:

base_list = [('Alto', 2020, 500),('MSFT', 2022, 300),('Guru99', 2019, 1070)]
def get_key(base_list):
    return base_list[2]
base_list.sort(key=get_key,reverse=True)
print("The change in base list is as follows",base_list)

الإخراج:

The change in the base list is as follows [('Guru99', 2019, 1070), ('Alto', 2020, 500), ('MSFT', 2022, 300)]

Code التفسير:

  • يتم تعريف المعلمة العكسية على أنها صحيحة لفرز الصف بترتيب تنازلي.
  • تأخذ الوظيفة المخصصة العنصر الثاني من الصف.
  • يتم استخدام هذا كمفتاح لوظيفة الفرز.

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

Python رمز:

base_list = [('Alto', 2020, 500),
('MSFT', 2022, 300),
('Guru99', 2019, 1070)]
base_list.sort(key=lambda base_list:base_list[2],reverse=True)
print("The change in base list is as follows",base_list)

الإخراج:

The change in the base list is as follows [('Guru99', 2019, 1070), ('Alto', 2020, 500), ('MSFT', 2022, 300)]

التفسير:

  • يساعدك تعبير lambda على فرز عناصر الصف من الأعلى إلى الأدنى باستخدام المفتاح باعتباره العنصر الثاني في الصف.
  • سيقوم البرنامج بالتحقق من أعلى قيمة للعنصر الثاني من الصف.

فرز عناصر القائمة باستخدام Len كمعلمة رئيسية

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

ما يلي Python يوضح الكود كيفية استخدام وظيفة Len مع وظيفة الفرز.

Python Code:

base_list=["Alto", "Guru99", "Python", "Google", "Java"]
base_list.sort(key=len)
print("The sorted list based on length:",base_list)

الإخراج:

The sorted list based on length: ['Alto', 'Java', 'Guru99', 'Python', 'Google']

Code التفسير:

فرز عناصر القائمة باستخدام Len

  • يصبح طول العنصر فهرسًا للمعلمة الرئيسية لترتيب القائمة بترتيب تصاعدي.
  • تقوم دالة Len بتقدير طول كل عنصر موجود في القائمة الأساسية.
  • فهو يحتفظ بالعنصر الأقصر على الجانب الأيسر والعنصر الأكبر على الجانب الأيمن.
  • هنا، يبلغ طول كلمتي "alto" و"java" أربعة أحرف، وهما مرتبان أولاً في القائمة، متبوعًا بـ Guru99، والتي يبلغ طولها 6.

يوضح هذا المثال مفهوم المعامل العكسي في دالة الفرز كما هو موضح أدناه:

Python Code:

base_list=["Alto", "Guru99", "Python", "Google", "Java"]
base_list.sort(key=len,reverse=True)
print("The sorted list based on length:",base_list)

الإخراج:

The sorted list based on length: ['Guru99', 'Python', 'Google', 'Alto', 'Java']

فرز عناصر القائمة باستخدام وظيفة محددة من قبل المستخدم كمعلمة رئيسية

يمكنك أيضًا استخدام دالة معرفة من قبل المستخدم كمعامل رئيسي لفرز قائمة. إليك مثال:

Python Code:

base_list = [{'Example':'Python','year':1991},{'Example':'Alto','year':2014},{'Example':'Guru99', 'year':1995},
{'Example':'Google','year':1985},{'Example':'Apple','year':2007},{'Example':'Emails','year':2010},]
def get_year(element):
    return element['year']
base_list.sort(key=get_year)
print("The base list after sorting using explicit criteria",base_list)

الإخراج:

The base list after sorting using explicit criteria [{'Example': 'Google', 'year': 1985}, {'Example': 'Python', 'year': 1991}, {'Example': 'Guru99', 'year': 1995}, {'Example': 'Apple', 'year': 2007}, {'Example': 'Emails', 'year': 2010}, {'Example': 'Alto', 'year': 2014}]

Code التفسير:

  • يتم إنشاء دالة معرفة من قبل المستخدم لإرجاع السنة
  • تأخذ المعلمة الرئيسية وظيفة معرفة من قبل المستخدم كمعيار.
  • ستقوم وظيفة الفرز بترتيب القائمة بترتيب تصاعدي بناءً على قيمة عنصر "السنة".

الفرق بين طريقة الفرز وطريقة الفرز في Python

بعد استعراض الأمثلة السابقة، من المفيد مقارنة أداتي الفرز مباشرةً. قبل تلخيص الاختلافات، دعونا نفهم بنية دالة الفرز (Sorted).

Python بناء الجملة:

sorted (list_name, reverse=…., key=..)

Code التفسير:

  • تقوم الدالة التي تم فرزها بفرز القائمة إما بترتيب تصاعدي أو ترتيب تنازلي.
  • تقبل الدالة ثلاث معلمات، منها معلمتان من النوع الاختياري ومعلمة واحدة من النوع المطلوب.
  • المعلمة list_name مطلوبة عند استخدام الطريقة المصنفة.
  • يمكن أن تأخذ الطريقة Sorted أي نوع من القائمة القابلة للتكرار كمدخل.
  • المعلمات الرئيسية والمعلمات العكسية هي معلمات اختيارية في طريقة الفرز في Python.

فيما يلي مثال على استخدام وظيفة الفرز والفرز في Python:

Python رمز:

#Use of the Sorted method
Base_list=[11,10,9,8,7,6]
print("the original list is",Base_list)
New_list=sorted(Base_list)
print("the New list using sorted method is",New_list)
#Use of the Sort method
Base_list=[11,10,9,8,7,6]
print("the original list is",Base_list)
New_list=Base_list.sort()
print("the New list using sort method is",New_list)

الإخراج:

the original list is [11, 10, 9, 8, 7, 6]
the new list using the sorted method is [6, 7, 8, 9, 10, 11]
the original list is [11, 10, 9, 8, 7, 6]
the new list using the sort method is None

Code التفسير:

  • يتم تمرير القائمة الأصلية كمعلمة مطلوبة للوظيفة التي تم فرزها.
  • تقوم الطريقة Sorted بإرجاع قائمة جديدة إلى جانب القائمة الأصلية.
  • نظرًا لعدم تمرير أي معلمات إضافية إلى الطريقة التي تم فرزها، يتم فرز القائمة الجديدة افتراضيًا بترتيب تصاعدي.
  • لا تقوم وظيفة الفرز بإنشاء أي قائمة جديدة.

فيما يلي النقاط الرئيسية المتعلقة بأوجه التشابه والاختلاف:

وظيفة مرتبة وظيفة الفرز
وظيفة مرتبة في Python هي وظيفة مضمنة تأخذ list_name كمعلمة مطلوبة. لا تأخذ وظيفة الفرز القائمة الأصلية كمعلمة.
تقوم الطريقة المصنفة بإرجاع قائمة جديدة لا تقوم وظيفة الفرز بإرجاع قائمة جديدة
يجب استخدام الدالة المصنفة للقوائم القابلة للتكرار يجب استخدام دالة الفرز للقوائم غير القابلة للتكرار.
لا يعدل القائمة الأصلية ويسمح لنا بالاحتفاظ بالبيانات الأصلية. تقوم وظيفة الفرز بتعديل الوظيفة الأصلية وبالتالي تشغل مساحة أقل من الذاكرة

متى يتم استخدام الطريقة المصنفة أو طريقة الفرز؟

دعونا نأخذ مثالاً يتطلب فرز بيانات العرق. يستخدم البرنامج رقم الصدرية والوقت المستغرق بالثواني لإنهاء السباق.

Python رمز:

from collections import namedtuple
Base = namedtuple('Runner', 'bibnumber duration')
blist = []
blist.append(Base('8567', 1500))
blist.append(Base('5234', 1420))
blist.append(Base('2344', 1600))
blist.append(Base('2342', 1490))
blist.append(Base('23444', 1620))
blist.append(Base('6674', 1906))
print("original list",blist)
blist.sort(key=lambda x: getattr(x, 'duration'))
top_five_result = blist[:5]
print("Results using sort function",top_five_result)
r_blist=sorted(blist,key=lambda x: getattr(x, 'duration'))
top_five_result = r_blist[:5]
print("Results using sorted function",top_five_result)

الإخراج:

original list [Runner(bibnumber='8567', duration=1500), Runner(bibnumber='5234', duration=1420), Runner(bibnumber='2344', duration=1600), Runner(bibnumber='2342', duration=1490), Runner(bibnumber='23444', duration=1620), Runner(bibnumber='6674', duration=1906)]

Results using sort function [Runner(bibnumber='5234', duration=1420), Runner(bibnumber='2342', duration=1490), Runner(bibnumber='8567', duration=1500), Runner(bibnumber='2344', duration=1600), Runner(bibnumber='23444', duration=1620)]

Results using sorted function [Runner(bibnumber='5234', duration=1420), Runner(bibnumber='2342', duration=1490), Runner(bibnumber='8567', duration=1500), Runner(bibnumber='2344', duration=1600), Runner(bibnumber='23444', duration=1620)]

Code التفسير:

  • يتم فرز القائمة الأساسية باستخدام كل من وظيفة الفرز والوظيفة التي تم فرزها.
  • يتم فقدان القائمة الأساسية عند تطبيق وظيفة الفرز.
  • لا ينبغي تطبيق وظيفة الفرز على مجموعة البيانات الأصلية. ويجب استخدامه عندما يكون هناك نسخة من مجموعة البيانات الأصلية.
  • تحتفظ الدالة Sorted بالقائمة الأصلية. لا يتجاوز ذلك.
  • هذا يوفر أفضل tracالقدرة على إدارة البيانات بفعالية وكفاءة.

الأسئلة الشائعة

مرر المفتاح `key=str.lower` إلى دالة `sort()`، على سبيل المثال `names.sort(key=str.lower)`. تتم مقارنة كل سلسلة نصية بأحرف صغيرة، لذا يتم ترتيب الكلمتين 'Apple' و'banana' أبجديًا بغض النظر عن حالة الأحرف. يتم الحفاظ على حالة الأحرف الأصلية لكل عنصر في القائمة النهائية المرتبة.

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

Python كان يستخدم سابقًا خوارزمية Timsort، وهي خوارزمية هجينة تجمع بين فرز الدمج وفرز الإدراج. منذ الإصدار 3.11، يستخدم المفسر خوارزمية Powersort، وهي نسخة مشتقة من Timsort تتميز بسياسة دمج أكثر ذكاءً. كلا الخوارزميتين مستقرتان وتعملان في زمن O(n log n) في أسوأ الحالات.

نعم. دالة sort() مستقرة، لذا تحتفظ العناصر المتساوية بترتيبها النسبي الأصلي. يتيح لك هذا الفرز وفقًا لمعايير متعددة على مراحل، بدءًا من المفتاح الأقل أهمية وانتهاءً بالمفتاح الأكثر أهمية.

تستغرق دالة sort() زمنًا قدره O(n log n) في أسوأ الحالات وفي المتوسط. أما مع البيانات المرتبة مسبقًا، فيقترب زمنها من O(n)، لأن الخوارزمية الأساسية تكتشف التسلسلات المرتبة الموجودة وتعيد استخدامها بدلًا من إعادة ترتيبها.

مرر مفتاحًا لتحويل كل عنصر أثناء المقارنة، على سبيل المثال nums.sort(key=int). بعد ذلك، يتم ترتيب القائمة حسب القيمة العددية بدلًا من الأحرف، لذا يتم ترتيب '10' بشكل صحيح بعد '9'. تبقى العناصر المخزنة كسلاسل نصية؛ وتستخدم المقارنة فقط قيمتها العددية.

تُرتّب عملية الفرز التنبؤات حسب الدرجة أو الاحتمالية، وتختار أفضل k نتيجة في أنظمة التصنيف والتوصية، وتُرتّب السجلات أثناء إعداد البيانات. غالبًا ما تقوم مسارات التعلم الآلي بفرز قيم الميزات أو مخرجات النموذج قبل التقييم، لذا تُعدّ دالة الفرز المدمجة خطوةً شائعةً في المعالجة المسبقة.

نعم. يقوم مساعدو GitHub Copilot والذكاء الاصطناعي بإنشاء استدعاءات للدالتين sort() و sorted()، بما في ذلك الدوال الرئيسية وتعبيرات لامدا، انطلاقًا من تعليق قصير. بإمكانهم إعادة هيكلة الحلقات إلى عبارات فرز مفردة، مع ذلك، يُنصح باختبار الترتيب والتأكد من النتيجة في الحالات الاستثنائية.

تلخيص هذه التدوينة بـ: