Проверить (только целые) слова в строке - PullRequest
0 голосов
/ 12 сентября 2018

Тренировка на Checkio.Задача называется Популярные слова.Задача состоит в том, чтобы искать слова из списка (строк) в заданной строке.

Например:

textt="When I was One I had just begun When I was Two I was nearly new"

wwords=['i', 'was', 'three', 'near']

Мой код выглядит так:

def popular_words(text: str, words: list) -> dict:
    # your code here

    occurence={}
    text=text.lower()


    for i in words:
        occurence[i]=(text.count(i))

    # incorrectly takes "nearly" as "near"


    print(occurence)
    return(occurence)

popular_words(textt,wwords)

который работает почти нормально, возвращая

{'i': 4, 'was': 3, 'three': 0, 'near': 1} 

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

"search for words that are not first (index 0) or last (last index) and for these that begin/end with whitespace"

Могу ли я попросить о помощи, пожалуйста?Опираясь на этот довольно детский кодекс, пожалуйста.

Ответы [ 2 ]

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

Ваше простое решение будет таким:

from collections import Counter

textt="When I was One I had just begun When I was Two I was nearly new".lower()
wwords=['i', 'was', 'three', 'near']

txt = textt.split()

keys = Counter(txt)

for i in wwords:
    print(i + ' : ' + str(keys[i]))
0 голосов
/ 12 сентября 2018

вам будет лучше разделить ваше предложение, а затем считать слова, а не подстроки:

textt="When I was One I had just begun When I was Two I was nearly new"
wwords=['i', 'was', 'three', 'near']
text_words = textt.lower().split()
result = {w:text_words.count(w) for w in wwords}

print(result)

печать:

{'three': 0, 'i': 4, 'near': 0, 'was': 3}

если в тексте теперь есть знаки препинания, вам лучше использовать регулярные выражения, чтобы разбить строку в соответствии с не алфавитом:

import re

textt="When I was One, I had just begun.I was Two when I was nearly new"

wwords=['i', 'was', 'three', 'near']
text_words = re.split("\W+",textt.lower())
result = {w:text_words.count(w) for w in wwords}

результат:

{'was': 3, 'near': 0, 'three': 0, 'i': 4}

(другая альтернатива - использовать findall на словах: text_words = re.findall(r"\w+",textt.lower()))

Теперь, если ваш список "важных" слов большой, возможно, лучше подсчитать все слов и отфильтровать их, используя классические collections.Counter:

text_words = collections.Counter(re.split("\W+",textt.lower()))
result = {w:text_words.get(w) for w in wwords}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...