2016-04-14 44 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']]