Cómo ordenar las claves de un dict de Python por valor

Tengo un dict que se parece a esto

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

Y me gustaría convertirlo en DESC y crear una lista de solo las palabras clave. Por ejemplo, esto volvería

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

Todos los ejemplos que encontré usan lambda y no soy muy fuerte con eso. ¿Hay alguna manera de que pueda pasar por esto y ordenarlas a medida que avanzo ? Gracias por cualquier sugerencia.

PS: Podría crear el dictado inicial de forma diferente si ayudara.

Usted podría usar

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

(No necesitas la list en Python 2.x)

theDict.__getitem__ es en realidad equivalente a lambda x: theDict[x] .

(Un lambda es solo una función anónima. Por ejemplo

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

Esto es equivalente a

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

)

 >>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 } >>> sorted(d, key=d.get, reverse=True) ['keyword3', 'keyword1', 'keyword4', 'keyword2'] 

Siempre lo hice de esta manera … ¿existen ventajas al usar el método ordenado?

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

whoops no leyó la parte sobre no usar lambda = (

Se me ocurriría algo como esto:

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

Pero la solución de KennyTM es mucho mejor 🙂

No es posible ordenar un dict, solo obtener una representación de un dict que está ordenado. Los dictados son intrínsecamente ordenados menos, pero otros tipos, como listas y tuplas, no lo son. Por lo tanto, necesita una representación ordenada, que será una lista, probablemente una lista de tuplas. Por ejemplo,

 ''' 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 

salida:

 [('Vanita', {'score': 56}), ('Anil', {'score': 69}), ('Rahul', {'score': 75}), ('Dinesh', {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]