1

だから私はGooglePythonコードクラスに取り組んでいて、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メソッドを使用して、値(最大から最小)でソートされた辞書を作成中です:link。これが私のコードです:

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

元の辞書とソートされた辞書を印刷しましたが、辞書がソートされると、すべての値が2倍になっているようです。この種の問題に関連するいくつかのスレッドを調べて、.itemgetterのドキュメントを確認しましたが、同様の問題を抱えている他の人を見つけることができないようです。

誰かが私のコードがword_count関数で辞書を2回繰り返す原因で、値が増加する原因を指摘できますか?

ありがとう!

SB

4

1 に答える 1

1

word_count(1) 実際にはin を定義していませんdict_creator。私は見ることを期待していた

word_count = {}

開始時。つまり、word_count変更内容は別の場所でグローバルに定義されているため、呼び出すたびに同じ辞書にdict_creator追加され、値が増加します。少なくとも、あなたが示したコードからは、word_countは 1 つしかありません。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()タプルを返すので、wordすでに のようなもの('dict_creator', 1)です。そのまま印刷できます。呼び出しword_count[word]は のタプルを(key, value)キーとして使用しようとします。IOW、変数 word を呼び出したとしても、それは実際word_and_countにはword, count = word_and_countです。

(3) この部分では:

        return word_count #return word_count dictionary
        word_count.close()

私はあなたが意味すると思いますinput_file.close()が、その行は実行されないため、戻った「後」にファイルを閉じても意味がありません。別のオプションは、with慣用句を使用することです。

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

ここで、ファイルは自動的に閉じられます。

上記の変更を行った後、あなたのコードはうまくいくようです。

于 2013-01-29T11:19:51.450 に答える