我看过很多帖子基本上都在做我正在做的事情,但不幸的是我不知道为什么我会继续得到不是我想要的输出。问题是我每次在excel文件中出现某个单词时都会尝试递增字典,但是当我的代码当前时,每个单词的实例都会被视为一个新单词。例如,“the”在我的文件中出现约50次,但输出只是在许多不同的行上列出“the”,每个实例的计数为“1”。实际上,我希望“the”列出一次,计数为“50”。非常感谢任何澄清!这是我的代码:
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()
答案 0 :(得分: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 module提供了两种简化此代码的方法。
的人>>> 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})
>>> 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时,常规字典方法最适合。
计数器方法易于使用,并且有许多非常适合计算应用程序的实用程序(例如,most_common()方法列出了 n 最重要的排序顺序)。 backport of Counter可用于2.7之前的Python版本。
defaultdict 方法有一些缺点。仅仅访问缺失的值将导致字典增长。此外,要使用它,您需要了解工厂函数并知道可以使用无参数调用 int()来生成零值。
答案 1 :(得分: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)