Поиск конкретных символов в списке

11

Цель состоит в том, чтобы составить список из абзаца пользователя и выполнить итерации, чтобы я мог посчитать, сколько слов содержат специальные буквы «j, x, q, z».

Пример ввода:
в яме в земле жил хоббит. Ни грязного, грязного, мокрого отверстия, заполненного концами червей и сочного запаха, ни сухого, голого, песчаного отверстия, в котором нечего сидеть или есть; это была хоббит-нора, а это значит комфорт.

Пример вывода: 1 слово с редким символом

Я начал код, где я разбиваю абзац пользователя на список, но мне трудно перебирать список и находить каждый экземпляр специальных букв.

Это то, что я до сих пор:

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for astring in words:
        wds = words.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

def CoolPara(words):
    print(rareChar(words), 'word(s) with a rare character')

    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

Если я бегу с примером ввода, я получаю вывод «0 слов с редким символом». Как я мог это исправить, чтобы я мог получить ожидаемый результат. Любая помощь будет принята с благодарностью, так как я все еще относительно новичок в кодировании

Также быстрое примечание: мне разрешено использовать только методы / функции split () и Len ()

yariee
источник
.indexдолжен делать работу
bigbounty
Вы должны просмотреть выходные данные и добавить некоторые операторы печати, чтобы убедиться, что эти операторы и условия выполняются.
Fallenreaper
опечатка. не должна ли строка над внутренним циклом быть wds = astring.split ()
abhilb
Какова цель for astring in words: ?
norok2
От имен переменных я думаю, что вы запутались. Замените "для вяжущих в словах:" на "для слов в словах. Split ():". Затем "для символа в wds:", чтобы для символа в слове: ". И удалите" wds = words.split () ".
kantal

Ответы:

4

Может быть, это будет возможность познакомить вас с некоторыми возможностями Python:

from typing import List


def rare_char(sentence: str, rare_chars: List[str]=["j", "x", "q", "z"]) -> List[str]:
    return [word for word in sentence.split() if 
            any(char in word for char in rare_chars)]


def cool_para(sentence: str) -> str:
    return f"{len(rare_char(sentence))} word(s) with rare characters"

Этот ответ использует:

  1. набор текста , который может использоваться сторонними инструментами, такими как средства проверки типов, IDE, линтеры, но, что более важно, чтобы ваши намерения были понятны другим людям, которые могут читать ваш код.
  2. аргументы по умолчанию , вместо того, чтобы жестко их кодировать внутри функции. Очень важно задокументировать ваши функции, чтобы пользователь не был удивлен результатом (см. Принцип наименьшего удивления ). Есть, конечно, другие способы документирования вашего кода (см. Строки документации ) и другие способы проектирования этого интерфейса (может быть классом). например, ), но это просто для демонстрации сути.
  3. Составьте список представлений , которые могут сделать ваш код более читабельным, сделав его более декларативным, а не обязательным . Может быть трудно определить намерение, стоящее за императивными алгоритмами.
  4. интерполяция строк , которая в моем опыте менее подвержена ошибкам, чем конкатенация.
  5. Я использовал pep8 руководство по стилю для именования функций, что является наиболее распространенным соглашением в мире Python.
  6. Наконец, вместо печати я вернул a strв cool_paraфункцию, потому что код под # DO NOT CHANGE CODE BELOWкомментарием печатает результат вызова функции.
Маркус Виниций Монтейру
источник
1
Одна из лучших реализаций, которые я видел до сих пор. Не может быть более Pythonic. :-) Я бы просто переименовать rare_chars()в find_rare_words()вместо этого.
19
1

В идеале вы хотите использовать понимание списка.

def CoolPara(letters):
  new = [i for i in text.split()]
  found = [i for i in new if letters in i]
  print(new) # Optional
  print('Word Count: ', len(new), '\nSpecial letter words: ', found, '\nOccurences: ', len(found))

CoolPara('f') # Pass your special characters through here

Это дает вам:

['In', 'a', 'hole', 'in', 'the', 'ground', 'there', 'lived', 'a', 'hobbit.', 'Not',
 'a', 'nasty,', 'dirty,', 'wet', 'hole,', 'filled', 'with', 'the', 'ends', 'of',
'worms', 'and', 'an', 'oozy', 'smell,', 'no', 'yet', 'a', 'dry,', 'bare,', 'sandy',
'hole', 'with', 'nothing', 'in', 'it', 'to', 'sit', 'down', 'on', 'or', 'to', 'eat;',
'it', 'was', 'a', 'hobbit-hole,', 'and', 'that', 'means', 'comfort']
Word Count:  52
Special letter words:  ['filled', 'of', 'comfort']
Occurences:  3
бородка
источник
0
def rareChar(words):
rareWords = 0
rareChars = ['j', 'x', 'q', 'z']

#Split paragraph into words
words.split()
for word in words:
    #Split words into characters
    chars = word.split()
    for char in chars:
        if char in rareChars:
            rareWords = rareWords + 1
return rareWords

def CoolPara(words):
    #return value rather than printing
    return '{} word(s) with a rare character'.format(rareChar(words))


# DO NOT CHANGE CODE BELOW

print(CoolPara(input("Enter: ")))

Вход: Здравствуйте, это предложение о зоопарках

Вывод: 1 слово (а) с редким символом

KILLtheWEEZEL
источник
0

Следующий код является вашим редактированием, которое приводит к правильному ответу 1

def main():

    def rareChar(words):
        rareWords = 0
        rareChars = ['j', 'x', 'q', 'z']

        all_words = list(words.split())

        for a_word in all_words:
            for char in a_word:
                if char in rareChars:
                    rareWords = rareWords + 1
        return rareWords

    def CoolPara(words):
        print(rareChar(words), 'word(s) with a rare character')


    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

main()

Ответ:

C:\Users\Jerry\Desktop>python Scraper.py
Enter: In a hole in the ground there lived a hobbit. Not a nasty, dirty, wet hole, filled with the ends of worms and an oozy smell, no yet a dry, bare, sandy hole with nothing in it to sit down on or to eat; it was a hobbit-hole, and that means comfort.

1 word(s) with a rare character
wundermahn
источник
0

Этот код будет работать для вас. Снимите отметку со слова input и отметьте оператор слов words, который я использовал для проверки кода.

Пара-метод не нужен.

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for word in words:
        wds = word.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

words = 'john xray quebec zulu'
# words = (input("Enter: "))

x = rareChar(words)
print(f"There are {x} word(s) with a rare character")
ВК Хили
источник
0

Решение, предоставленное Barb, работает на одну букву:

CoolPara ( 'е')

Но он не работает с несколькими персонажами, как это было предложено оригинальным постером. Например, это не возвращает правильные результаты:

CoolPara ( "jxqz")

Вот немного улучшенная версия решения Барба:

def CoolPara(letters):
    new = [i for i in text.split()]
    found = list()
    for i in new:
        for x in i:
            for l in letters:
                if x == l:
                    found.append(i)
    print("Special letter words: ", found)
    print("word(s) with rare characters ", len(found))
shantanuo
источник