Сортировка словаря по значениям в python

#python #sorting #dictionary

#python #сортировка #словарь

Вопрос:

У меня есть словарь с ключом в виде слов и значениями в виде целых чисел.

Возможно ли отсортировать словарь по значениям?

Я хочу иметь возможность выбирать 10 наиболее часто встречающихся слов в моем словаре. Значения представляют количество слов, а ключи представляют слово.

 counter = 9
for a,b in sorted(dict_.iteritems()):
        if counter > 0:
            print str(a),str(b) "n"
            counter-=1
  

Это то, что у меня есть на данный момент, но это только распечатка первых 10 элементов в словаре. Как бы я распечатал 10 наиболее часто используемых элементов? (т. е. Значения с наибольшим значением int в качестве значения?)

Ответ №1:

Попробуйте sorted(dict_.iteritems(), key=lambda item: -item[1]) .

Комментарии:

1. @khachik: Это для того, чтобы перевернуть список.

2. @nmichaels: Тогда он должен быть отображен обратно с помощью lambda x: (x[0], -x[1]) ? Почему бы и нет sorted(..., key=..., reverse=True) ?

3. Отрицание ключа и добавление reverse= True имеют эквивалентные эффекты. На возвращаемые отсортированные элементы это никак не влияет, только на их порядок. Я использовал отрицательный ключ, потому что это мое личное стилистическое предпочтение.

Ответ №2:

Использовать

 sorted(dict_.iteritems(), key=lambda x:x[1]) 
  

или

 import operator
sorted(.... key=operator.itemgetter(1)) 
  

для сортировки на основе значений элементов. Вы можете использовать reverse=True аргумент для инвертирования порядка результатов (по умолчанию используется возрастание значений) и нотацию среза ( results[:10] ) для повторения только первых 10 элементов. Вы также можете опустить флаг reverse и использовать [-10:] для получения топ-10.

Комментарии:

1. Аааа, я себя немного люблю operator .

Ответ №3:

Словари Python неупорядочены, но вы можете преобразовать их в список кортежей с помощью items() и передать соответствующую функцию сравнения в sort key параметр.

sorted() имеет аналогичный ключевой параметр. Вы хотели бы отсортировать по lambda item: item[1] , чтобы получить значение из items() и iteritems() . Затем вы можете просто отрезать первые N элементов.

Итак…

 for a, b in sorted(dict_.iteritems(), key=lambda item: item[1], reverse=True)[:10]:
    print a, b
  

Комментарии:

1. Разве это не сейчас for a, b in sorted(dict_.iteritems(), key=lambda item: item[1], reverse=True)[:10]:

2. @MichaelTomkins: Это! 2011 я, должно быть, пропустил это.

Ответ №4:

Вы вообще не можете сортировать dicts. Они неупорядочены, т. Е. порядок не определен и совершенно бессмыслен (для вас).

Однако вы можете выполнить сортировку .iteritems() с помощью key=operator.itemgetter(1) (другие ответы отрицают значение, но вы можете просто использовать срез [-10:] , чтобы получить последние 10 элементов). Или, в данном конкретном случае, просто используйте collections.Counter , который поставляется с .most_common(n) методом.

Комментарии:

1. очевидно, что dicts неупорядочены, но вопрос в том, возможно ли отсортировать его по значениям.

Ответ №5:

Для того, чтобы сделать это, вы должны отсортировать его, используя key аргумент. key должна быть функция, которая принимает элемент в качестве входных данных и возвращает другой, который должен быть сортируемым, и он будет сортировать целые элементы, используя этот ключ. И берем последние 10 элементов (они отсортированы в порядке возрастания). В вашем случае вам нужно будет сделать что-то вроде этого:

 for a,b in sorted(key=lambda x: (x[1], x[0]), dict_.iteritems())[-10:]:
    print str(a), str(b)