2012-05-14 196 views
0

我的字典像下面排序字典的Python字典

d = { 
    'hain': {'facet': 1, 'wrapp': 1, 'chinoiserie': 1}, 
    'library': {'sconc': 1, 'floor': 1, 'wall': 2, 'lamp': 6, 'desk': 1, 'table': 1, 'maine': 1} 
} 

所以一本字典,我想根據最終的價值進行排序扭轉這種詞典:

所以我所期待的打印出這樣的事:

key_1, key_2 , value 
library lamp  6 
library wall  2 

等等...

我如何得到這個?

感謝

回答

6

這裏是你怎麼能拿你正在尋找的排序列表:

items = ((k, k2, v) for k in d for k2, v in d[k].items()) 
ordered = sorted(items, key=lambda x: x[-1], reverse=True) 

這首先你的字典轉換成產生的元組(key_1, key_2, value)發電機,然後排序此基礎上的價值。 reverse=True使其從最高到最低排序。

下面是結果:

>>> pprint.pprint(ordered) 
[('library', 'lamp', 6), 
('library', 'wall', 2), 
('hain', 'facet', 1), 
('hain', 'wrapp', 1), 
('hain', 'chinoiserie', 1), 
('library', 'sconc', 1), 
('library', 'floor', 1), 
('library', 'desk', 1), 
('library', 'table', 1), 
('library', 'maine', 1)] 

注意,當值完全匹配,順序是任意的(除了項目將永遠key_1分組),如果您想一些其他的行爲只是編輯問題與你在這些情況下的期望。

獲得該列表後,可以通過遍歷像這樣把它打印出來:

for key_1, key_2, value in ordered: 
    print key_1, key2, value   # add whatever formatting you want to here 
0

我不知道你到底怎麼想的輸出排序,但是這應該讓你開始:

>>> for key in d: 
     for key2 in d[key]: 
      print key, key2, d[key][key2] 
+1

我看到你一位IDLE愛好者。團結,兄弟! –

+0

@AntiEarth我也是! – jamylak

1

如果你需要它有序首先value然後升序按key進行排序,然後key_2進行逆向排序:

dout={} 
for e in d: 
    for es in d[e]: 
     lineOut='%s %s %i' % (e, es, d[e][es]) 
     key= d[e][es] 
     dout.setdefault(key, []).append(lineOut) 

for e in sorted(dout, reverse=True): 
    for ea in sorted(dout[e], reverse=False): 
     print ea   

打印:

library lamp 6 
library wall 2 
hain chinoiserie 1 
hain facet 1 
hain wrapp 1 
library desk 1 
library floor 1 
library maine 1 
library sconc 1 
library table 1