Посчитайте частоту слов по заданному индексу в файле - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь подсчитать вхождение слов по определенному индексу в моем файле и распечатать его как словарь.

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. Я первая строка с \ t apple \ t с 2018 года
  2. Я вторая линия с \ t apple \ t с 2017 года
  3. Я третья строка с \ t apple \ t с 2016 года
  4. Я четвертая строка с \ t бананом с 2010 года
  5. Я пятая строка с \ t бананом с 1999 года

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Проблема 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)
0 голосов
/ 21 сентября 2018

Вы повторяете слишком много раз по одной и той же линии.Обратите внимание, что результаты, которые вы получаете, в 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 

Или, если вы можете использовать Счетчик :

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...