Слова, отсортированные по частоте, в книге (файл .txt)

Я использую:

from collections import Counter
wordlist = open('mybook.txt','r').read().split()
c = Counter(wordlist)
print c

# result :
# Counter({'the': 9530, 'to': 5004, 'a': 4203, 'and': 4202, 'was': 4197, 'of': 3912, 'I': 2852, 'that': 2574, ... })

напечатать все слова книги, отсортированные по частоте.

Как записать этот результат в выходной файл .txt?

g = open('wordfreq.txt','w')
g.write(c)   # here it fails 

Вот желаемый результат wordfreq.txt :

9530
до, 5004
а, 5004
и, 4203
было, 4197
...


person Basj    schedule 02.11.2015    source источник
comment
что ты пытался сделать? вы проводили какие-либо исследования? Я надеюсь, что никто не ответит на это и позволит вам попробовать что-нибудь. SO — это не место, где можно просто попросить кого-то написать для вас код бесплатно. Вам нужно попробовать и изучить, как сделать что-то в первую очередь.   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell, если вы не чувствуете ответа на него, тогда не делайте этого. Я пробовал разные вещи, в том числе пытался json.dumps dict, а затем понял, что это не только dict, но и более сложная вещь.. .Ну опять же, если вам не нравится этот вопрос, то не отвечайте на него, но я не вижу смысла в вашем комментарии.   -  person Basj    schedule 03.11.2015
comment
@Basj Несколько вещей, во-первых, я не проголосовал за ваш вопрос ... но другие сделали это, потому что ваш вопрос не показывает попытки решить эту проблему. если у вас есть tried various things, опубликуйте их в своем вопросе. Мы можем сказать вам, где вы ошибаетесь... Кроме того, я могу выполнить простой поиск в Google и легко найти решение. Отсутствие исследования перед тем, как задать вопрос, также обычно приносит вам много отрицательных голосов.   -  person John Ruddell    schedule 03.11.2015
comment
Ваш точный вопрос How to write this result in a .txt output file ? в поиске Google. поиск в Google... первый результат... второй результат. Насколько сложен поиск в гугле? ответ прямо там, если вы попытаетесь. Помните, Google — ваш друг. Не обращайтесь напрямую к SO.   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell Спасибо за ваш ответ. Я думал, что вставка моих неудачных попыток с помощью json.dumps действительно загрязнит вопрос шумом и снизит читабельность в будущем. Ну, я не буду больше добавлять, если никто не хочет отвечать, все, и точка. Я подумал, что это может быть интересно. Вы говорите, что это не так, ладно, пусть будет так.   -  person Basj    schedule 03.11.2015
comment
чувак, используй цикл for в словаре и пиши для каждой новой строки. for key, val in c.iteritems(): напишите ключ через запятую и значение. вы можете написать строку более одного раза. или используйте writelines для получения дополнительной информации. исследовательская запись в файл.   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell Спасибо. Я пробовал это, но тогда (с for key, val in c.iteritems():) это больше не сортировалось! Принимая во внимание, что когда я печатал (c), он был отсортирован   -  person Basj    schedule 03.11.2015
comment
он никогда не был отсортирован. словари не сортируются и не хранят никакого отсортированного расположения. вы можете преобразовать его в ordereddict, который будет отсортирован, если вам нужно   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell: В print c он был отсортирован! (проверил трижды)   -  person Basj    schedule 03.11.2015
comment
Печать @Basj не имеет ничего общего с порядком сортировки. словари не сортируются. нет порядка сортировки по умолчанию. Я не знаю, как еще это сказать. Если не верите мне, то посмотрите сами.   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell: при выполнении print c в 4-й строке (то есть Counter) отображаемый результат сортируется, точка. (можешь попробовать). Откуда берется эта волшебная сортировка, я не знаю, но она сортируется (Здесь у меня сотни элементов, и они волшебным образом сортируются только с помощью 4-х строк кода, которые я вставил.!)... Я не знаю знаю, откуда это, но это правда.   -  person Basj    schedule 03.11.2015
comment
счетчик - это словарь. да, он печатает его в отсортированном виде, что не означает, что он отсортирован. посмотрите здесь, как его отсортировать stackoverflow.com/questions/9001509/   -  person John Ruddell    schedule 03.11.2015
comment
@JohnRuddell Да, я согласен с вами в этом. Может быть, у вас есть идеи о том, как изменить stackoverflow.com/a/33488137/1422096, чтобы выполнить сортировку цикла по dict? Я бьюсь с этим с 20 минут :)   -  person Basj    schedule 03.11.2015
comment
@Basj конечно. Я разместил ответ. Вы все еще слишком много требуете от людей. хороший программист должен уметь разбираться в этом. ресурсы там, если вы попытаетесь исследовать это.   -  person John Ruddell    schedule 03.11.2015


Ответы (3)


если вы хотите написать это в отсортированном виде, вы можете сделать это.

from collections import Counter
wordlist = open('so.py', 'r').read().split()
word_counts = Counter(wordlist)

write_file = open('wordfreq.txt', 'w')
for w, c in sorted(word_counts.iteritems(), key=lambda x: x[1], reverse=True):
    write_file.write('{w}, {c}\n'.format(w=w, c=c))
person John Ruddell    schedule 02.11.2015

Я думаю, что это может быть необходимой вам помощью: как распечатать словарь в том формате, который вы запрашивали. Первые четыре строки — это исходный код.

from collections import Counter
wordlist = open('so.py', 'r').read().split()
c = Counter(wordlist)
print c

outfile = open('output.txt', 'w')
for word, count in c.items():
    outline = word + ',' + str(count) + '\n'
    outfile.write(outline)
person Prune    schedule 02.11.2015
comment
Спасибо! Небольшая вещь: как отсортировать по частоте (count)? В print c он был волшебным образом отсортирован! (проверил трижды) - person Basj; 03.11.2015
comment
Практический ответ заключается в том, что вы ищете в строке словарь сортировки Python по значению. Как вы не нашли что-то до того, как написали свой комментарий? - person Prune; 03.11.2015

Я думаю, что это можно сделать немного проще. Также я использовал контекстный менеджер (with) для автоматического закрытия файлов.

from collections import Counter

with open('mybook.txt', 'r') as mybook:
    wordcounts = Counter(mybook.read().split())

with open('wordfreq.txt', 'w') as write_file:
    for item in word_counts.most_common():
        print('{}, {}'.format(*item), file=write_file)

Если файл особенно большой, вы можете избежать его одновременного чтения в память, используя

    wordcounts = Counter(x for line in mybook for x in line.split())
person John La Rooy    schedule 02.05.2017