Странная продукция от .itemgetter для сортировки списка питоном ценностей

Таким образом, я продолжаю работать Google Python Code Class и попытка сделать осуществление Word_Count.py. Цель состоит в том, чтобы создать словарь слов (ключ), сортированный подсчетом слов (стоимость), и возвратить их как кортежи для печати.

Я создал функцию помощника, чтобы создать мой словарь:

def dict_creator(filename): #helper function to create a dictionary each 'word' is a key and the 'wordcount' is the value
            input_file = open(filename, 'r') #open file as read
            for line in input_file: #for each line of text in the input file
                    words = line.split() #split each line into individual words
                    for word in words: #for each word in the words list(?)
                            word = word.lower() #make each word lower case.
                            if word not in word_count: #if the word hasn't been seen before
                                    word_count[word] = 1 #create a dictionary key with the 'word' and assign a value of 1
                            else: word_count[word] += 1 #if 'word' seen before, increase value by 1
            return word_count #return word_count dictionary
            word_count.close()

Я нахожусь теперь в процессе создания словаря, сортированного стоимостью (крупнейший к самому маленькому) использование .itemgetter метода, обрисованного в общих чертах на этой почте здесь: связь. Вот мой код:

def print_words(filename):
        word_count = dict_creator(filename) #run dict_creator on input file (creating dictionary)
        print sorted(word_count.iteritems(), key=operator.itemgetter(1), reverse=True)
        #print dictionary in total sorted descending by value. Values have been doubled compared to original dictionary?
        for word in sorted(word_count.iteritems(), key=operator.itemgetter(1), reverse=True):
                #create sorted list of tuples using operator module functions sorted in an inverse manner
                a = word
                b = word_count[word]
                print a, b #print key and value

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

Traceback (most recent call last):
  File "F:\Misc\google-python-exercises\basic\wordcount_edited.py", line 74, in 
    print_words(lorem_ipsum) #run input file through print_words
  File "F:\Misc\google-python-exercises\basic\wordcount_edited.py", line 70, in print_words
    b = word_count[word]
KeyError: ('in', 3)

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

Кто-либо мог указать на то, что заставляет мой код повторять по словарю во второй раз в функции word_count, которая вызывает увеличение ценностей?

Спасибо!

SB

1
nl ja de

1 ответы

(1) Вы на самом деле не определяете word_count в dict_creator . Я ожидал видеть

word_count = {}

в начале. Это означает, что безотносительно word_count изменяется, определяется в другом месте и глобальный, поэтому каждый раз, когда вы звоните dict_creator , это добавит к тому же самому word_count словарь, увеличивая стоимости. У вас только когда-либо есть один word_count , по крайней мере из кода, который вы показали.

(2) Что касается KeyError:

   for word in sorted(word_count.iteritems(), key=operator.itemgetter(1), reverse=True):
            #create sorted list of tuples using operator module functions sorted in an inverse manner
            a = word
            b = word_count[word]

iteritems() returns the tuples, so word is already something like ('dict_creator', 1). You can simply print it as it is. Calling word_count[word] tries to use the tuple of (key, value) as the key. IOW, even though you've called the variable word, it's really word_and_count, with word, count = word_and_count.

(3) В этой части:

        return word_count #return word_count dictionary
        word_count.close()

Я думаю, что вы имеете в виду input_file.close() , но нет никакого смысла в закрытии файла "после того, как" вы возвращаетесь, потому что та линия не будет выполнена. Другой выбор состоит в том, чтобы использовать с идиома:

with open(filename) as input_file:
    code_goes_here = True
return word_count

здесь файл будет автоматически закрыт.

После создания вышеупомянутых изменений ваш код, кажется, работает на меня.

1
добавлено
@s_boardman: хорошо, если вы don' t, тогда каждый раз, когда вы звоните dict_creator - который doesn' t создают dict:^) - you' ll использовать тот же самый словарь. Если вы звоните dict_creator дважды на том же самом файле, ценности будут, удваивается. Если вы называете его на двух отдельных файлах, you' ll получают объединенные общие количества.
добавлено автор DSM, источник
Ах да, у меня действительно есть ' word_count = {} ' но it' s выше ' dict_creator' функция. Я лучше поместил бы его в функцию, надлежащую тогда?
добавлено автор s_boardman, источник
Это имеет настолько больше смысла! Большое спасибо за всю помощь.:)
добавлено автор s_boardman, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)