2013-03-12 19 views
10

Zaraz po odkryciu niesamowitego posortowanego(), utknąłem ponownie.Python Posortowane: Sortowanie słownika według wartości (DESC), a następnie według klucza (ASC)

Problem polega na tym, że mam słownik ciągu znaków (klucz): integer (wartość) i muszę posortować go w porządku malejącym według jego wartości całkowitych, ALE jeśli dwa elementy mają tę samą wartość, a następnie rosnąco kolejność kluczy.

Przykładem aby uczynić go bardziej zrozumiałym:

d = {'banana':3, 'orange':5, 'apple':5} 
    out: [('apple', 5), ('orange', 5), ('banana', 3)] 

Po robi rozeznanie przyjechałem na coś takiego:

sorted(d.items(), key=operator.itemgetter(1,0), reverse=True) 
    out: [('orange', 5), ('apple', 5), ('banana', 3)] 

To dlatego, że jest odwrotna do sortowania zarówno wartość i klucz. Potrzebuję klucza do odwrócenia.

Naprawdę byłbym wdzięczny za pomoc. Z góry dziękuję!

Odpowiedz

22

Coś jak

In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5} 

In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0])) 
Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)] 
-1
  • Słowniki nie mogą być sortowane bezpośrednio, więc trzeba zamiast uporządkować przedmiotów() lista krotek zawierających pary klucz/wartość.

  • Ponieważ chcesz sortować według pola wartości, a następnie pola kluczowe, konieczne jest wyodrębnienie tych pól z krotki, aby użyć ich jako klucza sortowania przy użyciu operator.itemgetter, która pobiera określone pole.

  • Na koniec, aby posortować malejąco na jednym polu i zejść na innym, wykonaj dwa przejścia, najpierw sortuj za pomocą klucza drugorzędnego rosnąco, a następnie kolejne sortowanie według klucza głównego w dół. Ten krok polega na Pythonie sort stability.

Na przykład:

import operator 
In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5} 

In [2]: fruit = sorted(d.items(), key=operator.itemgetter(0)) 
In [3]: sorted(fruit, key=operator.itemgetter(1), reverse=True) 
Out[3]: [('apple', 5), ('orange', 5), ('banana', 3)] 

Zobacz Python Sorting-HOWTO guide więcej szczegółów.