2012-10-25 40 views
7

Tôi muốn chuyển đổi một dict vào dict được sắp xếp trong pythonchuyển đổi một dict để dict được sắp xếp trong 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} 

Output tôi mong muốn là:

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}} 

(theo thứ tự giảm dần của các giá trị và các kết quả phải là một dict)

+1

Tại sao bạn muốn làm điều này, thay vì chỉ có một danh sách được sắp xếp? – emschorsch

Trả lời

15

Bạn không thể sắp xếp một dict vì từ điển không có thứ tự.

Thay vào đó, sử dụng 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 

Các "đặt hàng" mà bạn nhìn thấy trong một đối tượng JSON là không có ý nghĩa, như JSON đối tượng là không có thứ tự [RFC4267].

Nếu bạn muốn đặt hàng có ý nghĩa trong JSON của mình, bạn cần sử dụng danh sách (danh sách được sắp xếp theo cách bạn muốn). Một cái gì đó như thế này là những gì bạn muốn:

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

Với cùng một dict d, bạn có thể tạo một danh sách sắp xếp (đó là những gì bạn muốn) bằng cách:

>>> 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)] 

Bây giờ bạn chỉ cần vượt qua l đến m['top5'] và đổ nó:

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

@emschorsch tôi muốn thêm dict đầu ra cho dict khác và chuyển nó thành trả lời json. –

+0

@emschorsch tôi đã chỉnh sửa mã của tôi ở trên, vui lòng xem qua nó. –

+0

@CodeNinja Các đối tượng JSON không có thứ tự, do đó bạn sẽ cần phải sử dụng danh sách thay thế. –

Các vấn đề liên quan