2016-09-22 4 views
-4

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

Например, если у меня есть строка «горькое масло с маслом», выход должен быть [(масло, 2), (a, 1), (мешковатое, 1), (горькое, 1)).

Мой ниже код сортирует словарь по значениям в порядке убывания. Но я не могу выполнить вторую часть, т. Е. Если значения одинаковые, то у меня есть сортировочные ключи в порядке возрастания.

def count_words(s,n): 
    words = s.split(" ") 
    wordcount = {} 
    for word in words: 
    if word not in wordcount: 
    wordcount[word] = 1 
    else: 
    wordcount[word] += 1 
    sorted_x = sorted(wordcount.items(), key=operator.itemgetter(1), reverse=True) 
    sorted_asc = sorted(wordcount.items(), key=operator.itemgetter(0)) 
return sorted_x 
+0

Вы не упомянули, в чем проблема ... это может быть полезно. –

ответ

2

Для этого, что вам нужно, чтобы написать компаратор, который сортирует значения по количеству первым, и если они равны, то он сортирует значение от ключей.

from collections import defaultdict 


def count_words(s): 
    def comparator(first, second): 
     if first[1] > second[1]: 
      return 1 
     elif first[1] < second[1]: 
      return -1 

     if first[0] > second[0]: 
      return -1 
     elif first[0] == second[0]: 
      return 0 
     return 1 

    words = s.split(" ") 
    wordcount = defaultdict(int) 

    for word in words: 
     wordcount[word] += 1 

    return sorted(wordcount.items(), cmp=comparator, reverse=True) 


print count_words("bitter butter a c batter butter baggy") 

[('масло', 2), ('а', 1), ('мешковатые', 1), ('тесто', 1), ('горький', 1), ('с', 1)]

+0

Спасибо, Если значения одинаковы, тогда ключи должны быть в порядке возрастания. Таким образом, выход должен быть (масло, 2) (a, 1) (мешковатое, 1) (тесто, 1), (горькое, 1) (c, 1) – user3447653

+0

wow спасибо, что это работает как шарм ... – Learner

1

Я полагаю, что это помогло бы

s = { "A":1, "B":1, "C":1, "D":0, "E":2, "F":0 } 
rez = sorted(s.items(), key = lambda x: (x[1],x[0])) 

Результат

[('D', 0), ('F', 0), ('A', 1), ('B', 1), ('C', 1), ('E', 2)] 

Если йо u нужен обратный порядок, просто используйте -x [1] вместо x [1]

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