我有一个学校作业,要求我写一个程序,首先读取输入文件的名称,然后使用csv.reader()方法读取该文件。该文件包含一个以逗号分隔的单词列表。程序应该输出单词及其频率(每个单词在文件中出现的次数),没有任何重复。我已经能够弄清楚如何为一个特定的输入文件做到这一点,但程序需要能够读取多个输入文件。这是我目前所看到的:
with open('input1.csv', 'r') as input1file:
csv_reader = csv.reader(input1file, delimiter = ',')
for row in csv_reader:
new_row = set(row)
for m in new_row:
count = row.count(m)
print(m, count)
这是我得到的:
woman 1
man 2
Cat 1
Hello 1
boy 2
cat 2
dog 2
hey 2
hello 1
这对input1文件(几乎)有效,除了每次运行它时它都会改变顺序。我还需要它为另外两个输入文件工作吗?
样本CSVhello,cat,man,hey,dog,boy,Hello,man,cat,woman,dog,Cat,hey,boy
请看下面的示例代码,我已经注释了它,以便您理解它的作用和原因。
至于你们执行的订单不同是因为使用了set
。根据定义,set
是无序的。
还要注意,在您的实现中,您将传递两次行,一次将其转换为集合,另一次用于计数。除此之外,如果文件包含不止一行,那么逻辑就会失败,因为只有在读取文件的最后一行时才会到达计数部分。
import csv
def count_things(filename):
with open(filename) as infile:
csv_reader = csv.reader(infile, delimiter = ',')
result = {}
for row in csv_reader:
# go over the row by element
for element in row:
# does it exist already?
if element in result:
# if yes, increase count
result[element] += 1
else:
# if no, add and set count to 1
result[element] = 1
# sorting, explained in detail here:
# https://stackoverflow.com/a/613218/9267296
return {k: v for k, v in sorted(result.items(), key=lambda item: item[1], reverse=True)}
# you could just return unsorted result by using:
# return result
for key, value in count_things("input1.csv").items():
# iterate over items() by key/value pairs
# see this link:
# https://www.w3schools.com/python/python_dictionaries_access.asp
print(key, value)