• 0

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

أريد ان اعرف كيف يمكنني ترتيب القيم داخل القاموس بالقيمة value، كترتيب ال value بشكل تصاعدي او تنازلي علي سبيل المثال.

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

اذا كنت تستخدم نسخة قديمة من بايثون، ربما عليك استخدام الكود التالي:

import operator
x = {0: 1, 2: 3, 4: 5, 2: 2, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

وسيكون شكل الخرج كالتالي:

{0: 0, 0: 1, 2: 2, 2: 3, 4: 5}

وهنا قمنا بعمل ترتيب لل value بشكل تصاعدي.

للعلم ايضا يمكنك ترتيب ال keys بدلا من ال values اذا اردت بنفس الطريقة كالتالي:

import operator
x = {0: 1, 2: 3, 4: 5, 2: 2, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

لاحظ ان الفرق الوحيد بين الطريقتين هو تبديل 1 ب 0، حيث تعبر 0 عن keys بينما 1 عن values.

اما اذا كنت تستخدم python 3.7 او احدث،تستطيع استخدام الكود التالي:

>>> x = {0: 1, 2: 3, 4: 5, 2: 2, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 0: 1, 2: 2, 2: 3, 4: 5}

او باستخدام dict كالتالي:

>>> dict(sorted(x.items(), key=lambda item: item[1]))
{0: 0, 0: 1, 2: 2, 2: 3, 4: 5}
تمّ تعديل بواسطة Ahmed Sharshar

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

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

sorted(dic.items(), key=lambda z: z[1])

سيؤدي هذا إلى فرز القاموس حسب قيم كل إدخال داخل القاموس من الأصغر إلى الأكبر.
لفرزها بترتيب تنازلي فقط أضف rever1se = T1rue:

sorted(dic.items(), key=lambda z: z[1], reverse=True)

انظر للمثال التالي:

dic = {'one':1,'three':3,'five':5,'two':2,'four':4}
dic = sorted(dic.items(), key=lambda z: z[1])    
dic
# [('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]

أو يمكنك استخدام القواميس المرتّبة OrderedDict وهي مطابقة للقواميس العادية باستثناء أنّها تتذكر ترتيب العناصر لحظة إدراجها فيها، بمعنى أنّه عند إضافة العناصر إلى قاموس مرتب، تعاد العناصر حسب ترتيب مفاتيحها عند إضافتها أول مرّة.:

>>> # قاموس عادي غير مرتب
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> # قاموس مرتب حسب المفاتيح
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # قاموس مرتب حسب القيم
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # قاموس مرتب حسب طول السلسلة النصية في المفاتيح
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

تحافظ القواميس المرتّبة الجديدة على ترتيبها عند حذف العناصر منها، ولكن تُلحق المفاتيح الجديدة المضافة إلى نهاية القاموس مع المحافظة على ترتيب العناصر الباقية.
حل مشكلتك:

dic = {'one':1,'three':3,'five':5,'two':2,'four':4}
from collections import OrderedDict
OrderedDict(sorted(d.items(), key=lambda x: x[1]))
"""
OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)])
"""

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن