Python 3 sort a dict by its values

后端 未结 6 1208
伪装坚强ぢ
伪装坚强ぢ 2020-12-07 14:20

The only methods I found work for python2 or return only list of tuples.

Is it possible to sort dictionary, e.g. {\"aa\": 3, \"bb\": 4, \"cc\": 2, \"dd\": 1}

相关标签:
6条回答
  • 2020-12-07 15:02

    You can sort by values in reverse order (largest to smallest) using a dictionary comprehension:

    {k: d[k] for k in sorted(d, key=d.get, reverse=True)}
    # {'b': 4, 'a': 3, 'c': 2, 'd': 1}
    

    If you want to sort by values in ascending order (smallest to largest)

    {k: d[k] for k in sorted(d, key=d.get)}
    # {'d': 1, 'c': 2, 'a': 3, 'b': 4}
    

    If you want to sort by the keys in ascending order

    {k: d[k] for k in sorted(d)}
    # {'a': 3, 'b': 4, 'c': 2, 'd': 1}
    

    This works on CPython 3.6+ and any implementation of Python 3.7+ because dictionaries keep insertion order.

    0 讨论(0)
  • 2020-12-07 15:08

    To sort a dictionary and keep it functioning as a dictionary afterwards, you could use OrderedDict from the standard library.

    If that's not what you need, then I encourage you to reconsider the sort functions that leave you with a list of tuples. What output did you want, if not an ordered list of key-value pairs (tuples)?

    0 讨论(0)
  • 2020-12-07 15:15
    from collections import OrderedDict
    from operator import itemgetter    
    
    d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
    print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))
    

    prints

    OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])
    

    Though from your last sentence, it appears that a list of tuples would work just fine, e.g.

    from operator import itemgetter  
    
    d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
    for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
        print(key, value)
    

    which prints

    bb 4
    aa 3
    cc 2
    dd 1
    
    0 讨论(0)
  • 2020-12-07 15:17

    To sort dictionary, we could make use of operator module. Here is the operator module documentation.

    import operator                             #Importing operator module
    dc =  {"aa": 3, "bb": 4, "cc": 2, "dd": 1}  #Dictionary to be sorted
    
    dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
    print dc_sort
    

    Output sequence will be a sorted list :

    [('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]
    

    If we want to sort with respect to keys, we can make use of

    dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)
    

    Output sequence will be :

    [('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]
    
    0 讨论(0)
  • 2020-12-07 15:18

    itemgetter (see other answers) is (as I know) more efficient for large dictionaries but for the common case, I believe that d.get wins. And it does not require an extra import.

    >>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
    >>> for k in sorted(d, key=d.get, reverse=True):
    ...     k, d[k]
    ...
    ('bb', 4)
    ('aa', 3)
    ('cc', 2)
    ('dd', 1)
    

    Note that alternatively you can set d.__getitem__ as key function which may provide a small performance boost over d.get.

    0 讨论(0)
  • 2020-12-07 15:23

    Another way is to use a lambda expression. Depending on interpreter version and whether you wish to create a sorted dictionary or sorted key-value tuples (as the OP does), this may even be faster than the accepted answer.

    d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
    s = sorted(d.items(), key=lambda x: x[1], reverse=True)
    
    for k, v in s:
        print(k, v)
    
    0 讨论(0)
提交回复
热议问题