Как отсортировать ключи Python dict по значению - PullRequest
21 голосов
/ 05 августа 2010

У меня есть диктант, который выглядит следующим образом

{ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }

И я хотел бы преобразовать его DESC и создать список только ключевых слов.Например, это вернет

["keyword3" , "keyword1" , "keyword4" , "keyword2"]

Все примеры, которые я нашел, используют лямбду, и я не очень силен в этом.Есть ли способ, которым я мог бы пройти через это, и сортировать их, как я иду ?Спасибо за любые предложения.

PS: Я мог бы создать исходный дикт по-другому, если бы это помогло.

Ответы [ 5 ]

43 голосов
/ 05 августа 2010

Вы можете использовать

res = list(sorted(theDict, key=theDict.__getitem__, reverse=True))

(вам не нужно list в Python 2.x)

theDict.__getitem__ фактически эквивалентно lambda x: theDict[x].

(Лямбда - это просто анонимная функция. Например

>>> g = lambda x: x + 5
>>> g(123)
128

Это эквивалентно

>>> def h(x):
...   return x + 5
>>> h(123)
128

)

18 голосов
/ 05 августа 2010
>>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }
>>> sorted(d, key=d.get, reverse=True)
['keyword3', 'keyword1', 'keyword4', 'keyword2']
2 голосов
/ 05 августа 2010

Я бы придумал что-то вроде этого:

[k for v, k in sorted(((v, k) for k, v in theDict.items()), reverse=True)]

Но Решение KennyTM намного приятнее:)

2 голосов
/ 05 августа 2010

я всегда делал это таким образом .... есть ли преимущества использования отсортированного метода?

keys = dict.keys()
keys.sort( lambda x,y: cmp(dict[x], dict[y]) )

упс не читал часть о том, что не использовать lambda = (

1 голос
/ 11 июля 2013

Невозможно отсортировать диктат только для того, чтобы получить представление сортированного дикта. Dicts по своей природе на порядок меньше, а другие типы, такие как списки и кортежи, - нет. Таким образом, вам нужно отсортированное представление, которое будет списком - вероятно, списком кортежей. Например,

'''
Sort the dictionary by score. if the score is same then sort them by name 
{ 
 'Rahul'  : {score : 75} 
 'Suhas' : {score : 95} 
 'Vanita' : {score : 56} 
 'Dinesh' : {score : 78} 
 'Anil'  : {score : 69} 
 'Anup'  : {score : 95} 
} 
'''
import operator

x={'Rahul' : {'score' : 75},'Suhas' : {'score' : 95},'Vanita' : {'score' : 56}, 
   'Dinesh' : {'score' : 78},'Anil' : {'score' : 69},'Anup' : {'score' : 95} 
  }
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
print sorted_x

выход:

[('Vanita', {'score': 56}), ('Anil', {'score': 69}), ('Rahul', {'score': 75}), ('Dinesh', {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...