2016-06-29 15 views
-1

Ich habe das folgende Wörterbuch.Sortieren Sie ein verschachteltes Wörterbuch in Python

var = a = { 
    'Black': { 'grams': 1906, 'price': 2.05}, 
    'Blue': { 'grams': 9526, 'price': 22.88}, 
    'Gold': { 'grams': 194, 'price': 8.24}, 
    'Magenta': { 'grams': 6035, 'price': 56.69}, 
    'Maroon': { 'grams': 922, 'price': 18.76}, 
    'Mint green': { 'grams': 9961, 'price': 63.89}, 
    'Orchid': { 'grams': 4970, 'price': 10.78}, 
    'Tan': { 'grams': 6738, 'price': 50.54}, 
    'Yellow': { 'grams': 6045, 'price': 54.19} 
} 

Wie ich es auf der Grundlage der price sortieren. Das resultierende Wörterbuch wird also wie folgt aussehen.

result = { 
    '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}, 
    'Magenta': { 'grams': 6035, 'price': 56.69}, 
    'Mint green': { 'grams': 9961, 'price': 63.89}, 
} 
+4

Beginnen Sie mit einer Datenstruktur, die * tatsächlich * sortiert werden kann, wie zB ein 'OrderedDict'. – deceze

+2

möglich duplizieren zu http://stackoverflow.com/questions/4110665/sort-nested-dictionary-by-value-and-remainder-by-another-value-in-python – Deca

+1

@Deca, es ist nicht das Duplikat von dass, weil das OP der anderen Frage sagt, dass er eine sortierte Liste der Schlüssel benötigt, die möglich ist. Aber ein Wörterbuch kann nicht sortiert werden. – SilentMonk

Antwort

5

eine OrderedDict aus einer Liste der bestellten Artikel Tupel Construct:

from collections import OrderedDict 

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

(.items() geht davon aus Python 3, in Python 2 iteritems sollten das gleiche tun.)

1
for s in sorted(a.iteritems(), key=lambda (x, y): y['price']): 
     print s 

Oder von OrderedDict

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

Ausgang:

[('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
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

Es hat funktioniert. Aber ich dachte, dass es eine andere Möglichkeit geben muss, die for-Schleife mit der sortierten Operation zu kombinieren, um das Ergebnis zu erhalten. – Pattu

+0

Da Sie sie sortiert benötigen, müssen wir OrderedDict verwenden. Für diesen Fall ist IMO for Schleife erforderlich. – onkar

0

Sie auch getitem aus der operator Bibliothek verwenden können:

from collections import OrderedDict 
from operator import getitem 

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

print(sorted_dict) 

Ausgang:

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})]) 
Verwandte Themen