كيفية فرز قاموس حسب القيمة في بايثون

المُقدّمة

القاموس في Python هو مجموعة من العناصر التي تخزن البيانات كأزواج مفتاح-قيمة. في Python 3.7 والإصدارات الأحدث ، يتم فرز القواميس حسب ترتيب إدراج العنصر. في الإصدارات السابقة ، كانت غير مرتبة.

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

فرز القاموس باستخدام ملف For أنشوطة

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

ملحوظة: لا يسمح لك الفرز بإعادة ترتيب القاموس في مكانه. نحن نكتب الأزواج المرتبة في قاموس فارغ جديد تمامًا.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

إذا قمت بتشغيل هذا مع مترجم Python ، فسترى:

{1: 1, 3: 4, 2: 9}

الآن بعد أن رأينا كيفية الفرز باستخدام الحلقات ، فلنلقِ نظرة على بديل أكثر شيوعًا يستخدم امتداد sorted() وظيفة.

فرز القاموس باستخدام مرتبة() المسمى الوظيفي

استخدمنا سابقًا ملف sorted() وظيفة لفرز قيم المصفوفة. عند فرز قاموس ، يمكننا تمرير وسيطة أخرى إلى ملف sorted() تعمل مثل هذا: sorted(dict1, key=dict1.get).

هنا، key هي دالة يتم استدعاؤها على كل عنصر قبل مقارنة القيم من أجل الفرز. ال get() يقوم التابع على كائنات القاموس بإرجاع قيمة مفتاح القاموس.

sorted(dict1, key=dict1.get) سيعيد التعبير قائمة المفاتيح التي تم فرز قيمها بالترتيب. من هناك ، يمكننا إنشاء قاموس جديد وفرز:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

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

فرز القاموس باستخدام عامل وحدة و itemgetter ()

operator تتضمن الوحدة النمطية itemgetter() وظيفة. تقوم هذه الدالة بإرجاع كائن قابل للاستدعاء يقوم بإرجاع عنصر من كائن.

على سبيل المثال ، دعنا نستخدم itemgetter() لإنشاء كائن قابل للاستدعاء يُرجع قيمة أي قاموس بمفتاح 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

كل قاموس لديه حق الوصول إلى items() طريقة. تقوم هذه الوظيفة بإرجاع أزواج القيم والمفاتيح الخاصة بالقاموس كقائمة من المجموعات. يمكننا فرز قائمة المجموعات باستخدام itemgetter() وظيفة لسحب القيمة الثانية من المجموعة أي قيمة المفاتيح في القاموس.

بمجرد فرزها ، يمكننا إنشاء قاموس بناءً على هذه القيم:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

بجهد أقل ، لدينا قاموس مرتبة حسب القيم!

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

فرز القاموس باستخدام وظيفة Lambda

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

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

دعنا نفرز القاموس حسب القيم باستخدام دالة lambda في ملف key حجة sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

لاحظ أن الطرق التي ناقشناها حتى الآن تعمل فقط مع Python 3.7 والإصدارات الأحدث. دعونا نرى ما يمكننا القيام به للإصدارات السابقة من Python.

إرجاع قاموس جديد بقيم مصنفة

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

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

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

وفي الختام

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

أخيرًا ، قمنا بتكييف حلنا للعمل على إصدارات Python الأقل من 3.7.

الاختلافات في sorted() الوظيفة هي الأكثر شيوعًا وموثوقية لفرز القاموس حسب القيم.

الطابع الزمني:

اكثر من ستاكابوز