2016-04-14 3 views
2

У меня есть словарь питона, который выглядит примерно так:Построение списка значений словаря, отсортированных по ключевым

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

Я хочу, чтобы получить список значений. Если я использую values(), я получаю это:

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

Однако, я хочу, чтобы в результате список списков для сортировки по словарю ключам в обратном порядке - то есть, размер, а затем цвета, а не цвет, а затем размер. Я хочу это:

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

Я не necesarilly знаю, что ключи словаря будут заранее быть, но я всегда знаю, хочу ли я их в алфавитном порядке или обратном алфавитном порядке.

Есть ли какой-нибудь питонический способ сделать это?

Единственное, что я могу думать, кажется ... не очень питон, как:

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

Это трудно идти от attributes.values() всем, что только для сортировки списка!

+0

Словари не упорядочены, поэтому нет простого способа указать y порядок, в котором показаны словарные ключи. Вы можете заказать дисплей, но не сами ключи в dict. Тем не менее, вы можете попробовать использовать 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

Вы можете сохранить некоторые запросы так: '[значение для ключа, значение в sorted (attributes.items(), reverse = True)]' –

+1

Или 'result = [val for key, val in sorted (attributes.items(), reverse = True)]', чтобы избежать второго раунда поиска. __Edit__: Ха. Избитый удар. :-) – ShadowRanger

+0

@ Robᵩ Отличная мысль, но я старался сделать как можно меньше изменений в исходном коде, поэтому было ясно, как это переводится. – kindall

1

Самый простой способ заключается в использовании OrderedDict, который запоминает порядок, в котором элементы имеют были добавлены:

import collections 

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

>>> result.values() 
[['s', 'm', 'l'], ['black', 'orange']] 
Смежные вопросы