Lista de clasificación de tuplas de tuplas

[((D,A),0.0),((D,C),0.0),((D,E),0.5)] 

Necesito ordenar la lista como:

 [((D,E),0.5),((D,A),0.0),((D,C),0.0)] 

He usado la función sorted() y puedo ordenar en base a los valores 0.5, 0.0 … Pero no puedo ordenar en orden alfabético ya que necesito que la lista se clasifique en orden descendente por los números y en orden ascendente de alfabetos si los números tienen el mismo valor.

Utilice una tupla como clave de clasificación con un negativo en el flotador para invertir el orden:

 >>> li=[(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)] >>> sorted(li, key=lambda t: (-t[-1],t[0])) [(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)] 

Si no puede hacer la negación (por ejemplo, en una cadena o valor de letra o algo no numérico), puede aprovechar el hecho de que la función de ordenación de Python es estable y hacer la clasificación en dos pasos:

 >>> li=[(('D','A'),'A'),(('D','C'),'A'),(('D','E'),'C')] >>> sorted(sorted(li), key=lambda t: t[-1], reverse=True) [(('D', 'E'), 'C'), (('D', 'A'), 'A'), (('D', 'C'), 'A')] 

Del mismo modo, puede suministrar sorted con un iterable que es el resultado de otro sort :

 >>> from operator import itemgetter >>> t = [(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)] >>> sorted(sorted(t), key=itemgetter(1), reverse=True) [(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)]