#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)