【问题标题】:Count frequency of words under given index in a file计算文件中给定索引下单词的频率
【发布时间】:2018-09-21 14:40:31
【问题描述】:

我正在尝试计算文件中特定索引下单词的出现次数并将其打印为字典。

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name, "r") as file:
        content_of_file = file.readlines()
        dict_of_fruit_count = {}
        for line in content_of_file:
            line = line[0:-1]
            line = line.split("\t")
            for fruit in line:
                fruit = line[1]
                dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
    return dict_of_fruit_count


print(count_by_fruit())

输出:{'apple': 6, 'banana': 6, 'orange': 3}

我得到了这个输出,但是,它没有正确计算单词的频率。在四处寻找之后,我似乎没有找到合适的解决方案。谁能帮我找出我的错误?

我的文件有以下内容:(数据用制表符分隔,示例中放“\t”,因为stackoverflow正在更改格式)

  1. 我是 2018 年 \t apple \t 的第一行
  2. 我是 2017 年的 \t 橙色 \t 的第二行
  3. 我是 2016 年 \t apple \t 的第三行
  4. 我是 2010 年的 \t 香蕉 \t 第四行
  5. 我是 1999 年的 \t 香蕉 \t 的第 5 行

【问题讨论】:

  • 感谢您的及时答复!你是对的,这可能是我潜在的朋友,不过,我正在寻找一个答案,可以指出我的逻辑为什么不正确以及导致它打印出异常值的原因,所以,我可以找出正确的解决方案
  • 好吧,如果您想要找出错误,您需要按照指南生成Minimal,Complete and Verifiable example
  • 我无法点击您的链接,因为该页面不存在,但我使用了最小(希望)、完整和可验证的示例以及我正在尝试的文件示例编辑了我的问题遍历:)
  • 你能澄清一下标签在每一行中的确切位置吗?

标签: python-3.x dictionary


【解决方案1】:

您在同一行上循环了太多次。请注意,您获得的结果都是您预期的 3 倍。

另外,在 Python 中,您也不需要读取整个文件。只需逐行遍历文件对象即可。

试试:

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name, "r") as f_in:
        dict_of_fruit_count = {}
        for line in f_in:
            fruit=line.split("\t")[1]
            dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
    return dict_of_fruit_count

可以进一步简化为:

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name) as f_in:
        dict_of_fruit_count = {}
        for fruit in (line.split('\t')[1] for line in f_in):
            dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
        return dict_of_fruit_count 

或者,如果你可以使用Counter

from collections import Counter 

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name) as f_in:
        return dict(Counter(line.split('\t')[1] for line in f_in))

【讨论】:

  • 非常感谢!它确实有效,我终于明白出了什么问题:)
【解决方案2】:

问题是for fruit in line:。拆分选项卡上的行会将它们分成三个部分。如果您每次都遍历这三个部分,为每个部分添加一个,那么您的计数将是实际数据的 3 倍。

下面是我如何编写这个函数,使用生成器表达式和Counter

from collections import Counter

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name, "r") as file:
        lines = (line[:-1] for line in file)
        fruit = (line.split('\t')[1] for line in lines)
        return Counter(fruit)

【讨论】:

  • 我一直在尝试避免使用 Counter,因为我认为在我的情况下这并不是必需的,可以通过其他方式来完成。你的例子也很完美!谢谢你的详细解释,让我的理解更清楚了!
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多