2013-05-27 4 views
2

Я создаю словарь для наиболее часто используемых слов и получаю первую десятку. Мне нужно отсортировать это для списка, который должен быть в порядке. Я не могу этого сделать, не делая список, который я не могу использовать. Вот мой код. Я прочь словарей нельзя сортировать, но мне все еще нужна помощь.Упорядочить словарь по частоте

most_used_words = Counter() 
zewDict = Counter(most_used_words).most_common(10) 
newDict = dict(zewDict) 
keys = newDict.keys() 
values = newDict.values() 
msg = ('Here is your breakdown of your most used words: \n\n' 
     'Word | Times Used' 
     '\n:--:|:--:' 
     '\n' + str(keys[0]).capitalize() + '|' + str(values[0]) + 
     '\n' + str(keys[1]).capitalize() + '|' + str(values[1]) + 
     '\n' + str(keys[2]).capitalize() + '|' + str(values[2]) + 
     '\n' + str(keys[3]).capitalize() + '|' + str(values[3]) + 
     '\n' + str(keys[4]).capitalize() + '|' + str(values[4]) + 
     '\n' + str(keys[5]).capitalize() + '|' + str(values[5]) + 
     '\n' + str(keys[6]).capitalize() + '|' + str(values[6]) + 
     '\n' + str(keys[7]).capitalize() + '|' + str(values[7]) + 
     '\n' + str(keys[8]).capitalize() + '|' + str(values[8]) + 
     '\n' + str(keys[9]).capitalize() + '|' + str(values[9])) 
r.send_message(user, 'Most Used Words', msg) 

Как бы сделать это так, сообщ печатает слова в порядке от наиболее часто используемых слов на вершине в меньшей мере, на дне с правильными значениями слова?

Редактировать: Я знаю, что словари не могут быть отсортированы самостоятельно, поэтому я могу как-то обойти это?

+0

Совет: используйте 'OrderedDict', он хранит ключи в порядке вставки. –

ответ

3

От Docs: most_common([n])

Вернуть список п наиболее распространенных элементов и их имп от самых распространенных по меньшей мере. Если n не указано, most_common() возвращает все элементы в счетчике. Элементы с одинаковыми подсчетов упорядочены произвольно:

>>> Counter('abracadabra').most_common(3) 
[('a', 5), ('r', 2), ('b', 2)] 

Ваш код может быть:

from collections import Counter 
c = Counter(most_used_words) 
msg = "Here is your breakdown of your most used words:\n\nWords | Times Used\n:--:|:--:\n" 
msg += '\n'.join('%s|%s' % (k.capitalize(), v) for (k, v) in c.most_common(10)) 
r.send_message(user, 'Most Used Words', msg) 
+0

Это был тот. Спасибо! – user2312690

2
import operator 
newDict = dict(zewDict) 

sorted_newDict = sorted(newDict.iteritems(), key=operator.itemgetter(1)) 
msg = '' 
for key, value in sorted_newDict: 
    msg.append('\n' + str(key).capitalize() + '|' + str(value)) 

Это будет сортировать по значениям словаря. Если вы хотите в другом порядке добавить reverse=True в sorted().

+2

Лучше использовать '.most_common' здесь – jamylak

+0

Лучше форматировать строки, уступая строкам намного медленнее. –

4

После того как вы values это так просто, как:

print('Word | Times Used') 
for e, t in collections.Counter(values).most_common(10): 
    print("%s|%d" % (e,t)) 

Распечатайте что-нибудь наподобие:

Word | Times Used 
e|4 
d|3 
a|2 
c|2 
Смежные вопросы