1

基本的に私が行っていることを行う投稿をたくさん見てきましたが、残念ながら、私が望んでいない出力を取得し続ける理由がわかりません。問題は、特定の単語が Excel ファイルに表示されるたびに辞書をインクリメントしようとしていることですが、単語のすべてのインスタンスが現在のコードのように新しい単語として扱われます。たとえば、「the」はファイル内で最大 50 回発生しますが、出力では「the」が多くの異なる行に表示され、インスタンスごとにカウントが「1」になります。実際には、「50」のカウントで「the」を1回リストしたい場合。説明をいただければ幸いです。これが私のコードです:

import csv
import string

filename = "input.csv"
output = "output1.txt"

def add_word(counts, word):
    word = word.lower()
    #the problem is here, the following line never runs
    if counts.has_key(word):
        counts[word] +=1
    #instead, we always go to the else statement...
    else:
        counts[word] = 1
    return counts

def count_words(text):
    word = text.lower()
    counts = {}
    add_word(counts, word)
    return counts

def main():
    infile = open(filename, "r")
    input_fields = ('name', 'country')
    reader = csv.DictReader(infile, fieldnames = input_fields)
    next(reader)
    first_row = next(reader)
    outfile = open(output, "w")
    outfile.write("%-18s%s\n" %("Word", "Count"))
    for next_row in reader:
        full_name = first_row['name']
        word = text.split(' ',1)[0]
        counts = count_words(word)
        counts_list = counts.items()
        counts_list.sort()
        for word in counts_list:
            outfile.write("%-18s%d\n" %(word[0], word[1]))
        first_row = next_row

if __name__=="__main__":
main()
4

2 に答える 2

6

単純な辞書を使用すると、dict.getメソッドはカウントに適しています。

>>> d = {}
>>> for color in 'red green blue green red red green'.split():
        d[color] = d.get(color, 0) + 1

>>> d
{'blue': 1, 'green': 3, 'red': 3}

collections モジュールは、このコードを単純化する 2 つの方法を提供します。

collections.Counterを使用したものを次に示します。

>>> from collections import Counter
>>> d = Counter()
>>> for color in 'red green blue green red red green'.split():
        d[color] += 1

>>> d
Counter({'green': 3, 'red': 3, 'blue': 1})

そして、collections.defaultdictアプローチがあります。

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for color in 'red green blue green red red green'.split():
        d[color] += 1

>>> d
defaultdict(<type 'int'>, {'blue': 1, 'green': 3, 'red': 3})

通常の辞書アプローチは、出力を通常の辞書にする必要がある場合、または古いバージョンの Python を使用している場合に最適です。

Counterアプローチは使いやすく、アプリケーションのカウントに適したユーティリティがいくつかあります (たとえば、most_common() メソッドはn 個の最大カウントをソート順にリストします)。Counterのバックポートは、2.7 より前のバージョンの Python で使用できます。

defaultdictアプローチにはいくつかの欠点があります。欠損値にアクセスするだけで、辞書が大きくなります。また、それを使用するには、ファクトリ関数を理解し、引数なしでint()を呼び出してゼロ値を生成できることを知っている必要があります。

于 2012-09-04T17:17:16.003 に答える
5

関数count_wordsは、呼び出されるたびに新しい辞書を作成しています (現在のresults辞書に追加するだけではなく.

ただし、このような場合は、 (モジュールCounterの特別な機能dictである) の使用を検討することをお勧めします。collections

from collections import Counter
c = Counter()
for row in csv_reader:
    c.update(text.lower() for text in row)

print(c)
于 2012-09-04T17:12:17.597 に答える