【问题标题】:Python algorithm of counting occurrence of specific word in csv计算csv中特定单词出现次数的Python算法
【发布时间】:2012-02-12 07:41:26
【问题描述】:

我刚开始学习python。 除了简单地使用 for 循环逐行遍历并读取之外,我很好奇在 CSV 文件中计算特定单词出现次数的有效方法是什么。

更具体地说,假设我有一个 CSV 文件,其中包含“名称”和“等级”两列,其中包含数百万条记录。

如何计算“等级”下出现“A”的次数?

非常感谢 Python 代码示例!

【问题讨论】:

  • 你必须阅读整个文件,否则你的算法会被证明是不正确的。逐行线性阅读它不是一个坏方法。
  • import csv; count = sum(1 for row in csv.dictreader(open(filename)) if row['Grade'] == 'A')
  • @agf:很好,但是当我尝试这个时,它比其他答案慢了 6-8 倍
  • @steabert 速度因素几乎肯定无关紧要。

标签: python algorithm csv counting


【解决方案1】:

您当然应该阅读所有成绩,在这种情况下也意味着阅读整个文件。您可以使用csv 模块轻松读取逗号分隔值文件:

import csv
my_reader = csv.reader(open('my_file.csv'))
ctr = 0
for record in my_reader:
    if record[1] == 'A':
        ctr += 1
print(ctr)

这非常快,我无法使用 Counter 方法做得更好:

from collections import Counter
grades = [rec[1] for rec in my_reader] # generator expression was actually slower
result = Counter(grades)
print(result)

最后但同样重要的是,列表有一个count 方法:

from collections import Counter
grades = [rec[1] for rec in my_reader]
result = grades.count('A')
print(result)

【讨论】:

    【解决方案2】:

    基本示例,使用标准 Python 库中的 csv 和 collections.Counter (Python 2.7+):

    import csv
    import collections
    
    grades = collections.Counter()
    with open('file.csv') as input_file:
        for row in csv.reader(input_file, delimiter=';'):
            grades[row[1]] += 1
    
    print 'Number of A grades: %s' % grades['A']
    print grades.most_common()
    

    输出(对于小数据集):

    Number of A grades: 2055
    [('A', 2055), ('B', 2034), ('D', 1995), ('E', 1977), ('C', 1939)]
    

    【讨论】:

    • 好的,但是您可以将Counter 应用于文件中行的第一个元素的生成器表达式
    • 谢谢!我接受了你的回答。但是我想将其与使用字典进行比较,以等级为键,出现为值,哪种方式更有效?
    • @laotazhurou, Counter 是dict 的子类,但速度有点慢。如果你真的需要加速 collections.defaultdict(int) 或 if ... count += 1 可能会更快。但是您始终可以使用 timeit 自行对其进行基准测试,请参阅 Johnsyweb 的 answer
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2021-12-18
    • 2014-08-24
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多