2012-10-25 11 views
7

chcę przekonwertować dict do sortowanych dict w pythonprzekonwertować dict do sortowanych dict w python

data = pandas.read_csv('D:\myfile.csv') 
for colname, dtype in data.dtypes.to_dict().iteritems(): 
    if dtype == 'object': 
     print colname 
     count = data[colname].value_counts() 
     d = dict((str(k), int(v)) for k, v in count.iteritems()) 
     f = dict(sorted(d.iteritems(), key=lambda item: item[1], reverse = True)[:5]) 
     print f 

     m ={} 
     m["count"]= int(sum(count))  
     m["Top 5"]= f  
     print m  
     k = json.dumps(m) 
     print k  
f = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3} 

Moja pożądany wynik to:

f = {'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3} 
k = {'count':24, 'top 5':{'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3}} 

(w kolejności malejącej wartości i wynik powinien być dict)

+1

Dlaczego chcesz to zrobić, zamiast tylko posortować listę? – emschorsch

Odpowiedz

15

Nie można posortować obiektu dict, ponieważ słownik nie ma porządku.

Zamiast używać collections.OrderedDict:

>>> from collections import OrderedDict 
>>> d = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3} 

>>> od = OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True)) 
>>> od 
OrderedDict([('Gears of war 3', 6), ('Batman', 5), ('gears of war 3', 4), ('Rocksmith', 5), ('Madden', 3)]) 

>>> od.keys() 
['Gears of war 3', 'Batman', 'gears of war 3', 'Rocksmith', 'Madden'] 
>>> od.values() 
[6, 5, 4, 5, 3] 
>>> od['Batman'] 
5 

"porządek" można zobaczyć w obiekcie JSON nie jest sensowne, jako obiekt JSON jest nieuporządkowana [RFC4267].

Jeśli chcesz mieć sensowny porządek w swoim JSON, musisz użyć listy (sortowanej tak, jak chciałeś). Coś w tym jest to, czego chcesz:

{ 
    "count": 24, 
    "top 5": [ 
    {"Gears of war 3": 6}, 
    {"Batman": 5}, 
    {"Rocksmith": 5}, 
    {"gears of war 3": 4}, 
    {"Madden": 3} 
    ] 
} 

Biorąc pod uwagę same DICT d, można wygenerować posortowaną listę (czyli to, co chcesz) przez:

>>> l = sorted(d.items(), key=lambda x:x[1], reverse=True) 
>>> l 
[('Gears of war 3', 6), ('Batman', 5), ('Rocksmith', 5), ('gears of war 3', 4), ('Madden', 3)] 

Teraz wystarczy przejść l do m['top5'] i zrzuć go:

m["Top 5"]= l 
k = json.dumps(m) 
+0

@emschorsch Chcę dodać wyjście Dict do innego Dict i przekonwertować go do odpowiedzi json. –

+0

@emschorsch redagowałem mój kod powyżej proszę przejść przez to. –

+0

Obiekty JSON @CodeNinja nie mają porządku, więc zamiast tego musisz użyć listy. –