2013-11-13 4 views
3

У меня есть список и словарь:Сортировка списка на основе другого СЛОВАРЬ

list1 = ["a", "b", "c", "d"] 

dict1 = 
{ 
    "a": 4, 
    "b": 3, 
    "c": 5, 
    "d": 9, 
    "e": 2, 
    "f": 8 
} 


То, что я хочу сделать, это своего рода песни1 по соответствующему значению в dict1.

В приведенном выше примере, я хочу список, чтобы стать ["b", "a", "c", "d"], отсортированных в соответствии с их значениями ..

Я знаю, что это должно быть что-то вроде ...

list2 = sorted(list1, key=dict1[x]) 

Но я застрял :((

Любая помощь будет очень ценна

ответ

4

вы супер близко key принимает функцию,. вам нужно обернуть получение V alues ​​из dict1 в lambda (также указал @falsetru):

>>> list2 = sorted(list1, key=lambda x: dict1[x]) 
>>> list2 
['b', 'a', 'c', 'd'] 
5

ключевой аргумент должен быть функцией.

Например, используя связанный метод dict.__getitem__ или dict.get:

>>> list1 = ["a", "b", "c", "d"] 
>>> dict1 = { "a": 4, "b": 3, "c": 5, "d": 9, "e": 2, "f": 8 } 
>>> sorted(list1, key=dict1.__getitem__) 
['b', 'a', 'c', 'd'] 
+0

Downvoter: Как я могу улучшить ответ? – falsetru

+0

Я одобрил, но вы должны рассмотреть использование 'dict1 .__ getitem__', поэтому возникает исключение, если отсутствует ключ, вместо того, чтобы просто использовать' None' для ключа. В Python3, если какой-либо из ключей отсутствует, вы получите 'TypeError: unorderable types: NoneType()

+0

@gnibbler, Спасибо за комментарий. Ты прав. Я обновил код ответа, чтобы использовать 'dict .__ getitem__'. – falsetru

0

я, кажется, был избит до канонических решений, так вот другой галс

from operator import itemgetter 
[k for (k, v) in sorted(dict1.items(), key=itemgetter(1)) if k in list1] 
['b', 'a', 'c', 'd'] 
0

Ключевые вещи другие предложили замечательно мощный.

Тем не менее, я думаю, что старый таймер во мне думает «почему бы просто не поместить данные в список экземпляров класса и предоставить __lt__ и/или __cmp__?» ИМО, было бы намного яснее.

Смежные вопросы