Вы действительно должны использовать класс Counter
вместо того, чтобы изобретать свое собственное колесо.
charcount
- это словарь, и словари не имеют неявного порядка сортировки. Поэтому нам придется преобразовать его в список, который можно отсортировать. Каждая запись в этом списке будет кортеж из числа и символа.
charcount.items()
уже дает нам список, который выглядит как [('\n', 1219), ('!', 6079)]
. К сожалению, если бы мы отсортировали этот список, он сначала отсортировал бы по символам, а затем (если символы когда-либо были равны) по количеству, а не наоборот. Следовательно, нам нужна ключевая функция , чтобы сообщить сортировке сначала посмотреть на счетчик, а затем (если количество равно) символ. К счастью, наша ключевая функция действительно проста; он просто обменивается на кортеж:
lambda (char,count): (count, char)
В качестве альтернативы, мы можем использовать понимание списка, чтобы поменять значения, получить что-то вроде: [('\n', 1219), ('!', 6079)]
, затем отсортировать и затем поменять значения снова.
charcount_list = sorted(charcount.items(), key=lambda (char,count):(count, char))
charcount_list теперь будет:
[('a', 1), ('e', 1), ('i', 1), ('l', 1), ('q', 1), ('t', 1), ('u', 1), ('y', 1),
('\n', 1219), ('^', 6030), ('*', 6034), ('&', 6043), ('$', 6046), ('{', 6046),
('+', 6066), ('!', 6079), ('%', 6104), ('}', 6105), ('[', 6108), ('_', 6112),
('#', 6115), (']', 6152), (' (', 6154), ('@', 6157), (')', 6186)]
Если вам нужен обратный порядок, просто укажите аргумент reverse=True
для sorted .