2016-04-14 67 views
2

排序我有一個Python字典,看起來是這樣的:建設字典值的列表,通過關鍵

attributes = { 
    'size': ['s','m','l'], 
    'color': ['black', 'orange'], 
} 

我想要得到值的列表。如果我使用values(),我得到這個:

>>> attributes.values() 
[['black', 'orange'], ['s', 'm', 'l']] 

不過,我希望得到的名單列表,通過以相反的順序字典鍵進行排序 - 即大小,然後顏色,沒有顏色,然後大小。我想這一點:

[['s', 'm', 'l'], ['black', 'orange']] 

我不necesarilly知道字典鍵是什麼事前,但我總是知道如果我想他們按字母順序或反向字母順序。

有沒有一些pythonic的方式來做到這一點?

我能想到的唯一的事情好像......不是很蟒蛇般:

keys = sorted(attributes.keys(), reverse=True) 
result = [] 
for key in keys: 
    result.append(attributes[key]) 

很難從attributes.values()去所有的,只是對列表進行排序!

+0

字典是無序的,所以沒有簡單的方法來指定y字典鍵的顯示順序。您可以訂購顯示器,但不是字典本身。但是,您可以嘗試使用Ordered Dict(包含在Python 2.7+中)來解決此問題。 –

+1

'sorted(attributes,reverse = True)',你不需要.keys –

回答

4

此代碼:

keys = sorted(attributes.keys(), reverse=True) 
result = [] 
for key in keys: 
    result.append(attributes[key]) 

基本上是其列表內涵被髮明瞭用例:

result = [attributes[key] for key in sorted(attributes.keys(), reverse=True)] 
+4

你可以保存一些查找,如下所示:'[value for key,value in sorted(attributes.items(),reverse = True)]' –

+1

或'result = [val for key,val in sorted(attributes.items(),reverse = True)]'避免第二輪查找。 __編輯___:哈。毆打一拳。 :-) – ShadowRanger

+0

@Robᵩ出色的一點,但我試圖儘可能少地改變原始代碼,所以它很清楚它是如何翻譯的。 – kindall

1

最簡單的方法是使用OrderedDict,它可以記住其中的元素有順序已插入:

import collections 

result = collections.OrderedDict(sorted(attributes.items(), reverse=True)) 

>>> result.values() 
[['s', 'm', 'l'], ['black', 'orange']]