Python: Как я могу подсчитать, сколько раз слово появляется в текстовом файле

#python #list

#питон #Список

Вопрос:

Вопрос в том, чтобы вывести количество книг, существующих в каждом жанре, из этого текстового файла

текстовый файл вызывается book_data.txt и содержит следующее

 #Listing showing sample book details 
#AUTHOR, TITLE, FORMAT, PUBLISHER, COST?, STOCK, GENRE
P.G. Wodehouse, Right Ho Jeeves, hb, Penguin, 10.99, 5, fiction
A. Pais, Subtle is the Lord, pb, OUP, 12.99, 2, biography
A. Calaprice, The Quotable Einstein, pb, PUP, 7.99, 6, science
M. Faraday, The Chemical History of a Candle, pb, Cherokee, 5.99, 1, science
C. Smith, Energy and Empire, hb, CUP, 60, 1, science
J. Herschel, Popular Lectures, hb, CUP, 25, 1, science
C.S. Lewis, The Screwtape Letters, pb, Fount, 6.99, 16, religion
J.R.R. Tolkein, The Hobbit, pb, Harper Collins, 7.99, 12, fiction
C.S. Lewis, The Four Loves, pb, Fount, 6.99, 7, religion
E. Heisenberg, Inner Exile, hb, Birkhauser, 24.95, 1, biography
G.G. Stokes, Natural Theology, hb, Black, 30, 1, religion 

Также в текстовый файл могут быть внесены изменения, так как же мне писать код, когда в текстовый файл вводится новый жанр (вновь введенная информация должна быть идентифицирована и введена в подсчет)

желаемый результат — это :

наука: 4 религия: 3 биография: 2 и т.д.

Комментарии:

1. Взгляните на collections.Counter()

2. Что вы уже пробовали до сих пор? Пожалуйста, поделитесь написанным вами кодом и укажите, что с ним не работает.

3. я еще не пытался задать этот вопрос, я не уверен, какой тип кода я бы использовал для подсчета времени, в течение которого появляется слово, без указания того, какие слова искать

4. ну… это не решающий сайт, но в качестве другого направления использования Counter вы можете использовать dict where key будет типом жанра и значением количества книг в определенном жанре

5. @JJBANG458 пожалуйста, не публикуйте здесь материалы, которые вы даже не пробовали. Вы должны опубликовать здесь, если вы застряли на конкретной проблеме с кодом, а не потому, что вы не хотите даже пытаться писать код.

Ответ №1:

Вы можете использовать collections.Counter вместе с выражением понимания:

 from collections import Counter 

def count_genres(filename):
    with open(filename, 'r') as f:
        return Counter(line.rsplit(',', 1)[1].strip() for line in f if line[0] != '#')
 

Если вы хотите, вы можете преобразовать Counter объект в a dict , выполнив dict(Counter(...)) .

Комментарии:

1. Я проголосовал, но вместо lstrip().rstrip() того, чтобы вы могли просто использовать strip()

Ответ №2:

На основе следующего ресурса здесь: поиск уникальных слов в Python

Мы можем попробовать следующее:

 biography = 0
science = 0
#etc...

text_file = open('book_data.txt', 'r')
text = text_file.readlines()

for line in text:
    words = line.split()
    topic = words[-1]
    if topic == "biography":
      biography = biography   1
    elif topic == "science":
      science = science   1
    #etc...

text_file.close()
 

Дайте мне знать, если это поможет.

Ответ №3:

Дополнительное решение для collections.Counter :

 from collections import defaultdict
from typing import List, Dict

f = """#Listing showing sample book details 
#AUTHOR, TITLE, FORMAT, PUBLISHER, COST?, STOCK, GENRE
P.G. Wodehouse, Right Ho Jeeves, hb, Penguin, 10.99, 5, fiction
A. Pais, Subtle is the Lord, pb, OUP, 12.99, 2, biography
A. Calaprice, The Quotable Einstein, pb, PUP, 7.99, 6, science
M. Faraday, The Chemical History of a Candle, pb, Cherokee, 5.99, 1, science
C. Smith, Energy and Empire, hb, CUP, 60, 1, science
J. Herschel, Popular Lectures, hb, CUP, 25, 1, science
C.S. Lewis, The Screwtape Letters, pb, Fount, 6.99, 16, religion
J.R.R. Tolkein, The Hobbit, pb, Harper Collins, 7.99, 12, fiction
C.S. Lewis, The Four Loves, pb, Fount, 6.99, 7, religion
E. Heisenberg, Inner Exile, hb, Birkhauser, 24.95, 1, biography
G.G. Stokes, Natural Theology, hb, Black, 30, 1, religion
"""

def count_gen(lines: List[str]) -> Dict[str, int]:
    r: Dict[str, int] = defaultdict(lambda: 0)
    for line in lines:
        if line.startswith("#") or not line:
            continue
        *_, genre = line.split(",")
        r[genre.strip()]  = 1

    return dict(r)


print(count_gen(f.split("n")))
 

Вот онлайн-пример — repl.it