Sort a nested dictionary in Python

前端 未结 4 1096
小蘑菇
小蘑菇 2020-12-20 04:53

I have the following dictionary.

var = a = { 
  \'Black\': { \'grams\': 1906, \'price\': 2.05},
  \'Blue\': { \'grams\': 9526, \'price\': 22.88},
  \'Gold\':         


        
相关标签:
4条回答
  • 2020-12-20 05:10

    Construct an OrderedDict from a list of ordered item tuples:

    from collections import OrderedDict
    
    ordered = OrderedDict(sorted(a.items(), key=lambda i: i[1]['price']))
    

    (.items() assumes Python 3, in Python 2 iteritems should do the same.)

    0 讨论(0)
  • 2020-12-20 05:16
    for s in sorted(a.iteritems(), key=lambda (x, y): y['price']):
           print s
    

    Or by OrderedDict

    from collections import OrderedDict
    res = OrderedDict(sorted(a.items(), key=lambda x: x[1]['price'], reverse=False))
    print res
    

    Output:

    [('Black', {'price': 2.05, 'grams': 1906}), ('Gold', {'price': 8.24, 'grams': 194}), ('Orchid', {'price': 10.78, 'grams': 4970}), ('Maroon', {'price': 18.76, 'grams': 922}), ('Blue', {'price': 22.88, 'grams': 9526}), ('Tan', {'price': 50.54, 'grams': 6738}), ('Yellow', {'price': 54.19, 'grams': 6045}), ('Magenta', {'price': 56.69, 'grams': 6035}), ('Mint green', {'price': 63.89, 'grams': 9961})]
    
    0 讨论(0)
  • 2020-12-20 05:18
    import collections
    
    update=collections.OrderedDict()
    result = sorted(a, key=lambda x: (a[x]['price']))
    for r in result:
        update[r]=a[r]
    
    print(update)
    
    0 讨论(0)
  • 2020-12-20 05:33

    You can also use getitem from the operator library:

    from collections import OrderedDict
    from operator import getitem
    
    sorted_dict = OrderedDict(sorted(a.items(), key = lambda x:getitem(x[1],'price')))
    
    print(sorted_dict)
    

    Output:

    OrderedDict([('Black', {'grams': 1906, 'price': 2.05}), ('Gold', {'grams': 194, 'price': 8.24}), ('Orchid', {'grams': 4970, 'price': 10.78}), ('Maroon', {'grams': 922, 'price': 18.76}), ('Blue', {'grams': 9526, 'price': 22.88}), ('Tan', {'grams': 6738, 'price': 50.54}), ('Yellow', {'grams': 6045, 'price': 54.19}), ('Magenta', {'grams': 6035, 'price': 56.69}), ('Mint green', {'grams': 9961, 'price': 63.89})])
    
    0 讨论(0)
提交回复
热议问题