سؤال

لدي قاموس القيم قراءة من حقلين في قاعدة البيانات:سلسلة الحقل حقل رقمي.سلسلة الحقل هي فريدة من نوعها, لذلك هذا هو مفتاح القاموس.

لا يمكنك الفرز على المفاتيح ولكن كيف يمكنني فرز على أساس القيم ؟

ملاحظة:لقد قرأت تجاوز سعة مكدس السؤال هنا كيف يمكنني فرز قائمة من القواميس من قيمة القاموس ؟ وربما يمكن تغيير رمز إلى قائمة القواميس ، ولكن منذ كنت لا تحتاج حقا قائمة القواميس أردت أن أعرف إذا كان هناك حل أبسط لفرز إما في ترتيب تصاعدي أو تنازلي.

هل كانت مفيدة؟

المحلول

فإنه ليس من الممكن فرز القاموس ، إلا أن الحصول على تمثيل القاموس أن يتم فرز.القواميس هي بطبيعتها orderless ، ولكن أنواع أخرى ، مثل قوائم الصفوف, لا.إذا كنت بحاجة إلى أمر نوع البيانات لتمثيل فرز القيم التي سوف تكون قائمة—ربما قائمة الصفوف.

فعلى سبيل المثال ،

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

sorted_x سوف تكون قائمة الصفوف حسب العنصر الثاني في كل tuple. dict(sorted_x) == x.

و بالنسبة لأولئك الذين يرغبون في فرز على مفاتيح بدلا من القيم:

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

في Python3 منذ الفتح لا يسمح [1] يمكننا استخدام

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

إذا كنت ترغب في الإخراج ديكت ، يمكنك استخدام collections.OrderedDict:

import collections

sorted_dict = collections.OrderedDict(sorted_x)

نصائح أخرى

بسيطة مثل: sorted(dict1, key=dict1.get)

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

إذا كنت بناء القاموس مع كلمات مفاتيح عدد تكرارات كل كلمة قيمة مبسطة هنا:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

ثم يمكنك الحصول على قائمة من الكلمات التي أمرت وتيرة استخدام مع sorted(d, key=d.get) - النوع تتكرر على القاموس المفاتيح باستخدام عدد من كلمة الحوادث كنوع الرئيسية .

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

وأنا أكتب هذا شرح مفصل لتوضيح ما الناس غالبا ما تعني "أنا يمكن بسهولة فرز قاموس الرئيسية, ولكن كيف يمكنني فرز حسب القيمة" - و أعتقد أن العملية كانت محاولة لمعالجة هذه المسألة.و الحل هو أن تفعل نوعا من قائمة المفاتيح ، استنادا إلى القيم كما هو مبين أعلاه.

هل يمكن استخدام:

sorted(d.items(), key=lambda x: x[1])

هذا النوع من القاموس حسب قيم كل إدخال في القاموس من الأصغر إلى الأكبر.

فرز في ترتيب تنازلي فقط إضافة reverse=True:

sorted(d.items(), key=lambda x: x[1], reverse=True)

Dicts لا يمكن فرزها ، ولكن يمكنك بناء فرز قائمة من لهم.

فرز قائمة من ديكت القيم:

sorted(d.values())

قائمة (المفتاح القيمة) أزواج مرتبة حسب القيمة:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))

في الآونة الأخيرة بايثون 2.7 لدينا الجديد OrderedDict النوع الذي يتذكر ترتيب البنود المضافة.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

على القاموس من الأصل ، الفرز حسب قيم:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

على OrderedDict يتصرف وكأنه طبيعي ديكت:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

تحديث:5 ديسمبر 2015 باستخدام بيثون 3.5

في حين وجدت الإجابة المقبولة مفيدة ، فوجئت أيضا أنه لم يتم تحديثه إلى مرجع OrderedDict من المكتبة القياسية مجموعات وحدة قابلة للحياة الحديثة البديلة لحل بالضبط هذا النوع من المشكلة.

from operator import itemgetter
from collections import OrderedDict

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = OrderedDict(sorted(x.items(), key=itemgetter(1)))
# OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

الرسمية OrderedDict وثائق تقدم مماثل جدا على سبيل المثال أيضا ، ولكن باستخدام امدا عن نوع الوظيفة:

# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
# OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

الى حد كبير نفس هانك شاذ الجواب:

sorted([(value,key) for (key,value) in mydict.items()])

أو الأمثل قليلا كما اقترح جون Fouhy:

sorted((value,key) for (key,value) in mydict.items())

ويمكن في كثير من الأحيان يكون مفيد جدا للاستخدام namedtuple.على سبيل المثال لديك قاموس 'اسم' للمفاتيح و "النتيجة" كما والقيم التي تريد الفرز على "النتيجة":

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

الفرز مع أدنى درجة الأولى:

worst = sorted(Player(v,k) for (k,v) in d.items())

الفرز مع أعلى الدرجات الأولى:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

الآن يمكنك الحصول على اسم درجة ، دعونا نقول ثاني أفضل لاعب (index=1) جدا Pythonically مثل هذا:

player = best[1]
player.name
    'Richard'
player.score
    7

اعتبارا من بيثون 3.6 المدمج في ديكت سوف يكون أمر

أخبار جيدة ، لذلك المرجع الأصلي في حالة استخدام الخرائط أزواج استردادها من قاعدة بيانات فريدة من نوعها مع سلسلة معرفات مفاتيح رقمية القيم القيم في المدمج في بيثون v3.6+ dict, الآن يجب أن تحترم إدراج النظام.

إذا نقول الناتج عمود الجدول تعبيرات من استعلام قاعدة البيانات مثل:

SELECT a_key, a_value FROM a_table ORDER BY a_value;

سيتم تخزينها في اثنين الثعبان الصفوف ، k_seq و v_seq (الانحياز من قبل العددية مؤشر مع طول نفس بالطبع) ، ثم:

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

تسمح الإخراج في وقت لاحق:

for k, v in ordered_map.items():
    print(k, v)

العائد في هذه الحالة (جديد الثعبان 3.6+ المدمج في ديكت!):

foo 0
bar 1
baz 42

في نفس الطلب في قيمة v.

حيث في بيثون 3.5 تثبيت على الجهاز حاليا ينتج:

bar 1
foo 0
baz 42

التفاصيل:

كما اقترح في عام 2012 من قبل ريمون Hettinger (cf.البريد على الثعبان-dev مع الموضوع "أكثر القواميس المدمجة مع التكرار أسرع") و الآن (في عام 2016) أعلن في بريد فيكتور Stinner إلى الثعبان-dev مع الموضوع "الثعبان 3.6 ديكت يصبح الاتفاق يحصل خاص الإصدار ؛ و الكلمات تصبح أمرت" بسبب إصلاح/تنفيذ مسألة 27350 "الاتفاق وأمر ديكت" في بيثون 3.6 ونحن الآن سوف تكون قادرة على استخدام المدمج في ديكت للحفاظ على إدراج النظام!!

نأمل أن هذا سوف يؤدي إلى طبقة رقيقة OrderedDict تنفيذ كخطوة أولى.كما @JimFasarakis-هيليارد أشار إلى بعض انظر استخدام حالات OrderedDict النوع أيضا في المستقبل.أعتقد الثعبان المجتمع ككل سوف تفقد بعناية, إذا كان هذا سوف تصمد أمام اختبار الزمن ، وما هي الخطوات القادمة.

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

  • الكلمة الحجج ،
  • (متوسط) ديكت التخزين

الأول لأنه يخفف الإرسال في تنفيذ المهام والأساليب في بعض الحالات.

الثانية كما أنها تشجع على استخدام أكثر سهولة dicts كما وسيطة التخزين في تجهيز الأنابيب.

ريمون Hettinger يرجى توفير وثائق تشرح "التكنولوجيا وراء الثعبان 3.6 القواميس"- من سان فرانسيسكو الثعبان ميتوب عرض مجموعة 2016-DEC-08.

وربما بعض كومة تجاوز سعة عالية مزينة السؤال والجواب الصفحات سوف تتلقى المتغيرات من هذه المعلومات و العديد من الأجوبة جودة عالية يتطلب في إصدار التحديث أيضا.

التحذير Emptor (ولكن انظر أيضا أدناه تحديث 2017-12-15):

كما @ajcr حق ملاحظات:"من أجل الحفاظ على جانب من جوانب هذا الجديد التنفيذ يعتبر تنفيذ التفاصيل و لا ينبغي الاعتماد عليه." (من whatsnew36) ليس أحمق قطف ، ولكن الاقتباس كان قطع متشائم بعض الشيء ;-).هذا وما زالت " (هذا قد يتغير في المستقبل ، وإنما هو المطلوب أن يكون هذا الجديد ديكت التنفيذ في لغة بعض النشرات قبل تغيير اللغة المواصفات إلى الولاية من أجل الحفاظ على دلالات لجميع الحالية والمستقبلية الثعبان التطبيقات ؛ وهذا يساعد أيضا على الحفاظ على الوراء التوافق مع الإصدارات القديمة من اللغة حيث عشوائي التكرار النظام لا يزال ساري المفعول ، مثلبيثون 3.5)."

حتى في بعض اللغات البشرية (مثلا ، الألمانية) ، استخدام الأشكال اللغة, و الآن قد أعلن ...في whatsnew36.

تحديث 2017-12-15:

في البريد الثعبان-dev قائمة, Guido van Rossum أعلن:

تجعل من ذلك."ديكت تحافظ على الإدراج النظام" هو الحاكم.وذلك بفضل!

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

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

WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

(الناس الذين الجواب "ليس من الممكن فرز ديكت" لم يقرأ السؤال!في الواقع, "أنا يمكن فرز على مفاتيح ، ولكن كيف يمكنني فرز على أساس القيم ؟" يعني بوضوح أنه يريد قائمة المفاتيح مرتبة وفقا قيمة من القيم.)

من فضلك لاحظ أن النظام غير واضحة المعالم (مفاتيح مع نفس القيمة في أمر تعسفي في الإخراج قائمة).

في بايثون 2.7, ببساطة:

from collections import OrderedDict
# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

نسخ ولصق من : http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

تتمتع ;-)

هذا هو الكود:

import operator
origin_list = [
    {"name": "foo", "rank": 0, "rofl": 20000},
    {"name": "Silly", "rank": 15, "rofl": 1000},
    {"name": "Baa", "rank": 300, "rofl": 20},
    {"name": "Zoo", "rank": 10, "rofl": 200},
    {"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
for foo in origin_list:
    print foo

print "\n>> Rofl sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rofl")):
    print foo

print "\n>> Rank sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rank")):
    print foo

وهنا النتائج:

الأصلي

{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}

Rofl

{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}

رتبة

{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}

إذا قيم رقمية يمكنك أيضا استخدام Counter من مجموعات.

from collections import Counter

x = {'hello': 1, 'python': 5, 'world': 3}
c = Counter(x)
print(c.most_common())

>> [('python', 5), ('world', 3), ('hello', 1)]    

جرب الطريقة التالية.دعونا نحدد قاموس يسمى mydict مع البيانات التالية:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

إذا كان أحد يريد أن نوع القاموس عن طريق مفاتيح واحدة يمكن أن تفعل شيئا مثل:

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

هذا يجب أن تعود الإخراج التالي:

alan: 2
bob: 1
carl: 40
danny: 3

من ناحية أخرى, إذا كان أحد يريد أن نوع القاموس من حيث القيمة (كما طلب في السؤال) ، يمكن القيام بما يلي:

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

نتيجة هذا الأمر (ترتيب القاموس من حيث القيمة) يجب أن تعود التالية:

bob: 1
alan: 2
danny: 3
carl: 40

يمكنك إنشاء "مؤشر مقلوب" ،

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

الآن معكوس لديه القيم ؛ كل قيمة لديه قائمة من تنطبق المفاتيح.

for k in sorted(inverse):
    print k, inverse[k]

يمكنك استخدام مجموعات.العداد.ملاحظة هذا العمل على حد سواء رقمية أو غير رقمية القيم.

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

بدءا من بيثون 3.6, dict الكائنات هي الآن أمر من قبل الإدراج النظام.انها رسميا في المواصفات من بيثون 3.7.

>>> words = {"python": 2, "blah": 4, "alice": 3}
>>> dict(sorted(words.items(), key=lambda x: x[1]))
{'python': 2, 'alice': 3, 'blah': 4}

قبل ذلك ، كان عليك أن تستخدم OrderedDict.

بيثون 3.7 الوثائق يقول:

تغير في الإصدار 3.7:قاموس النظام هو ضمان أن يكون الإدراج النظام.هذا السلوك كان تنفيذ تفاصيل CPython من 3.6.

يمكنك استخدام تخطي ديكت وهو القاموس الذي نهائيا حسب القيمة.

>>> data = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> SkipDict(data)
{0: 0.0, 2: 1.0, 1: 2.0, 4: 3.0, 3: 4.0}

إذا كنت تستخدم keys(), values() أو items() ثم عليك تكرار في ترتيب فرزها حسب القيمة.

انها تنفذ باستخدام تخطي قائمة datastructure.

from django.utils.datastructures import SortedDict

def sortedDictByKey(self,data):
    """Sorted dictionary order by key"""
    sortedDict = SortedDict()
    if data:
        if isinstance(data, dict):
            sortedKey = sorted(data.keys())
            for k in sortedKey:
                sortedDict[k] = data[k]
    return sortedDict

يمكنك أيضا استخدام وظيفة مخصصة التي يمكن أن تنتقل إلى مفتاح.

def dict_val(x):
    return x[1]
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=dict_val)

كما أشار Dilettant, ، بيثون 3.6 الآن الحفاظ على النظام!اعتقدت حصة وظيفة كتبت أن يخفف الفرز من iterable (tuple, قائمة, ديكت).في هذه الحالة يمكنك فرز إما على مفاتيح أو قيم ، ويمكن أن تأخذ رقمي المقارنة بعين الاعتبار. فقط >= 3.6!

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

تعليقات للتحسين أو دفع الطلبات مرحبا بك.

def sort_iterable(iterable, sort_on=None, reverse=False, num_as_num=False):
    def _sort(i):
      # sort by 0 = keys, 1 values, None for lists and tuples
      try:
        if num_as_num:
          if i is None:
            _sorted = sorted(iterable, key=lambda v: float(v), reverse=reverse)
          else:
            _sorted = dict(sorted(iterable.items(), key=lambda v: float(v[i]), reverse=reverse))
        else:
          raise TypeError
      except (TypeError, ValueError):
        if i is None:
          _sorted = sorted(iterable, key=lambda v: str(v), reverse=reverse)
        else:
          _sorted = dict(sorted(iterable.items(), key=lambda v: str(v[i]), reverse=reverse))

      return _sorted

    if isinstance(iterable, list):
      sorted_list = _sort(None)
      return sorted_list
    elif isinstance(iterable, tuple):
      sorted_list = tuple(_sort(None))
      return sorted_list
    elif isinstance(iterable, dict):
      if sort_on == 'keys':
        sorted_dict = _sort(0)
        return sorted_dict
      elif sort_on == 'values':
        sorted_dict = _sort(1)
        return sorted_dict
      elif sort_on is not None:
        raise ValueError(f"Unexpected value {sort_on} for sort_on. When sorting a dict, use key or values")
    else:
      raise TypeError(f"Unexpected type {type(iterable)} for iterable. Expected a list, tuple, or dict")

هنا هو الحل باستخدام الرمز البريدي على d.values() و d.keys().بضعة أسطر أسفل هذا الرابط (في القاموس عرض الكائنات) هو:

هذا يسمح إنشاء (القيمة الرئيسية) أزواج باستخدام الرمز البريدي():أزواج = الرمز(d.القيم () ، د.مفاتيح()).

حتى نتمكن من القيام بما يلي:

d = {'key1': 874.7, 'key2': 5, 'key3': 8.1}

d_sorted = sorted(zip(d.values(), d.keys()))

print d_sorted 
# prints: [(5, 'key2'), (8.1, 'key3'), (874.7, 'key1')]

استخدام ValueSortedDict من dicts:

from dicts.sorteddict import ValueSortedDict
d = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_dict = ValueSortedDict(d)
print sorted_dict.items() 

[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

تكرار من خلال ديكت و فرز القيم في ترتيب تنازلي:

$ python --version
Python 3.2.2

$ cat sort_dict_by_val_desc.py 
dictionary = dict(siis = 1, sana = 2, joka = 3, tuli = 4, aina = 5)
for word in sorted(dictionary, key=dictionary.get, reverse=True):
  print(word, dictionary[word])

$ python sort_dict_by_val_desc.py 
aina 5
tuli 4
joka 3
sana 2
siis 1

إذا كانت القيم هي الاعداد الصحيحه, و يمكنك استخدام بايثون 2.7 أو الأحدث, يمكنك استخدام collections.Counter بدلا من dict.على most_common طريقة تعطيك جميع البنود بحسب القيمة.

بالطبع, تذكر, كنت بحاجة إلى استخدام OrderedDict لأن العادية الثعبان القواميس لا تبقي النظام الأصلي.

from collections import OrderedDict
a = OrderedDict(sorted(originalDict.items(), key=lambda x: x[1]))

إذا لم يكن لديك بايثون 2.7 أو أعلى, أفضل ما يمكنك فعله هو تكرار عبر القيم في وظيفة مولد.(هناك OrderedDict 2.4 و 2.6 هنا, ولكن

أ) أنا لا أعرف عن كيف أنها تعمل بشكل جيد

و

ب) يجب عليك تحميل وتثبيت ذلك بالطبع.إذا لم يكن لديك حق الوصول الإداري ، ثم أخشى أن خيار الخروج.)


def gen(originalDict):
    for x, y in sorted(zip(originalDict.keys(), originalDict.values()), key=lambda z: z[1]):
        yield (x, y)
    #Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want. 

for bleh, meh in gen(myDict):
    if bleh == "foo":
        print(myDict[bleh])

يمكنك أيضا طباعة من كل قيمة ،

for bleh, meh in gen(myDict):
    print(bleh, meh)

يرجى تذكر أن إزالة الأقواس بعد الطباعة إذا لم تكن تستخدم بايثون 3.0 أو أعلى

هذا يعمل في 3.1.x:

import operator
slovar_sorted=sorted(slovar.items(), key=operator.itemgetter(1), reverse=True)
print(slovar_sorted)

لأجل اكتمال أنا نشر الحل باستخدام heapq.لاحظ أن هذا الأسلوب سوف تعمل على حد سواء رقمية أو غير رقمية القيم

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> x_items = x.items()
>>> heapq.heapify(x_items)
>>> #To sort in reverse order
>>> heapq.nlargest(len(x_items),x_items, operator.itemgetter(1))
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> heapq.nsmallest(len(x_items),x_items, operator.itemgetter(1))
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

فقط المستفادة ذات الصلة مهارة من بيثون للجميع.

يمكنك استخدام مؤقت قائمة لمساعدتك على فرز القاموس:

#Assume dictionary to be:
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}

# create a temporary list
tmp = []

# iterate through the dictionary and append each tuple into the temporary list 
for key, value in d.items():
    tmptuple = (value, key)
    tmp.append(tmptuple)

# sort the list in ascending order
tmp = sorted(tmp)

print (tmp)

إذا كنت ترغب في فرز قائمة في ترتيب تنازلي ، ببساطة تغيير الأصلية الفرز خط:

tmp = sorted(tmp, reverse=True)

باستخدام قائمة على الفهم ، بطانة ليكون:

#Assuming the dictionary looks like
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}
#One liner for sorting in ascending order
print (sorted([(v, k) for k, v in d.items()]))
#One liner for sorting in descending order
print (sorted([(v, k) for k, v in d.items()], reverse=True))

عينة الإخراج:

#Asending order
[(1.0, 'orange'), (500.1, 'apple'), (789.0, 'pineapple'), (1500.2, 'banana')]
#Descending order
[(1500.2, 'banana'), (789.0, 'pineapple'), (500.1, 'apple'), (1.0, 'orange')]
months = {"January": 31, "February": 28, "March": 31, "April": 30, "May": 31,
          "June": 30, "July": 31, "August": 31, "September": 30, "October": 31,
          "November": 30, "December": 31}

def mykey(t):
    """ Customize your sorting logic using this function.  The parameter to
    this function is a tuple.  Comment/uncomment the return statements to test
    different logics.
    """
    return t[1]              # sort by number of days in the month
    #return t[1], t[0]       # sort by number of days, then by month name
    #return len(t[0])        # sort by length of month name
    #return t[0][-1]         # sort by last character of month name


# Since a dictionary can't be sorted by value, what you can do is to convert
# it into a list of tuples with tuple length 2.
# You can then do custom sorts by passing your own function to sorted().
months_as_list = sorted(months.items(), key=mykey, reverse=False)

for month in months_as_list:
    print month
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top