Letter in word для проверки наличия буквы в слове

0 / 0 / 0

Регистрация: 14.11.2017

Сообщений: 9

1

Вывести список слов, в которых присутствует введённая буква

18.11.2017, 23:29. Показов 21407. Ответов 3


Студворк — интернет-сервис помощи студентам

Формат ввода
На первой строке вводится один символ — строчная буква.
На второй строке вводится предложение.

Формат вывода
Нужно вывести список слов (словом считается часть предложения, окружённая символами пустого пространства), в которых присутствует введённая буква в любом регистре, в том же порядке, в каком они встречаются в предложении.

Например-
Ввод
а
Ехал Грека через реку какая большая река.

Вывод
Ехал
Грека
какая
большая
река.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

18.11.2017, 23:29

Ответы с готовыми решениями:

Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква «Е»
Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых…

Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква «Е»
Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых…

Вывести на экран слова, в которых введенная буква встречается не более 1 раза
С++
Есть файл со словами
С клавиатуры вводится буква
Вывести на экран самое длинное слово, в…

Дана строка, вывести на экран позиции, на которых встречается буква, введенная с клавиатуры
3. Дана строка, вывести на экран позиции, на которых встречается буква, введенная с клавиатуры.

3

Эксперт по компьютерным сетям

5880 / 3340 / 1031

Регистрация: 03.11.2009

Сообщений: 9,965

19.11.2017, 04:11

2

Лучший ответ Сообщение было отмечено Павел112233 как решение

Решение

заберите (input) одну строку в переменную
заберите вторую

вторую строку разбейте на слова (split), получится список

циклом for пройдитесь по списку и проверяйте есть ли буква в очередном слове (letter in word)
если так, выводите (print) слово



1



0 / 0 / 0

Регистрация: 14.11.2017

Сообщений: 9

19.11.2017, 12:33

 [ТС]

3

А как сделать если вводится маленькая буква.то выводить слова и с маленькой и большой. И если вводится заглавная,то выводить и с заглавной и с маленькой?



0



Semen-Semenich

4179 / 3095 / 1100

Регистрация: 21.03.2016

Сообщений: 7,754

19.11.2017, 15:57

4

Лучший ответ Сообщение было отмечено Павел112233 как решение

Решение

Python
1
2
3
4
5
letter = 'а'
text = 'Ехал Грека через реку какая большая река.'
for word in text.split():
    if letter in word.lower():
        print(word)



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

19.11.2017, 15:57

4

Лично я считаю, что исходный код Python легче читать, когда все делается с отступом в четыре пробела. Итак, вот ваша функция снова с более широким отступом:

      def count_letter(mylist):
    count = 0
    for i in range(len(mylist)):
        if letter in i:
            count += 1
            a_list.append(i)
    return a_list
    print(len(a_list))

for i in range(...)будет перебирать набор целых чисел. Итак, будет принимать новое целочисленное значение для каждой итерации цикла. Сначала будет
0, тогда
1 на следующей итерации и т. д.

Затем вы спрашиваете
if letter in i:. Это никогда не может быть правдой. представляет собой строку и является целым числом. Строка никогда не может быть целым числом, поэтому этот оператор if никогда не будет выполнен. Скорее, вы хотите проверить, есть ли
letterнаходится в текущем слове (ое слово в списке). Оператор if должен гласить:

      if letter in mylist[i]:
    ...

Где текущее слово.

Затем вы увеличиваете и добавляете
iк . Вы, вероятно, хотели добавить
mylist[i] к, но я не понимаю, зачем тебе вообще нужно
a_list. Вам просто нужно, так как это отслеживает, сколько слов вы встретили на данный момент, для которых выполняется условие.
count также является переменной, которую вы должны возвращать в конце, поскольку это цель функции: вернуть количество слов (а не самих слов), содержащих определенную букву.

Кроме того, как ваш финал
printОператор с отступом делает его частью тела функции. Однако это после символа, что означает, что у него никогда не будет возможности напечатать. Когда вы используете
return внутри функции он завершает функцию, и поток выполнения возвращается в то место, из которого функция была первоначально вызвана.

Последнее изменение, которое необходимо применить, заключается в том, что ваша функция должна принимать букву для поиска в качестве параметра. Сейчас ваша функция принимает только один параметр — список слов для поиска.

Вот изменения, которые я бы применил к вашему коду:

      def count_letter(words, letter): # I find 'words' is a better name than 'mylist'.
    count = 0
    for i in range(len(words)):
        current_word = words[i]
        if letter in current_word:
            count += 1
    return count

Вот как вы можете использовать эту функцию:

      words = ["hello", "world", "apple", "sauce"]
letter = "e"
count = count_letter(words, letter)
print("The letter '{}' appeared in {} words.".format(letter, count))

Выход:

      The letter 'e' appeared in 3 words.

Домашнее задание к занятию 3. Функции. Разработка приложения ToDo

Задание 1

Реализуйте функцию count_letter, которая принимает список слов и некоторую букву и возвращает количество слов в списке, в которых эта буква встречается хотя бы один раз.

Например, для списка ['python', 'c++', 'c', 'scala', 'java'] и буквы c ваша функция должна вернуть число 3.

Подсказки

  • Используйте конструкцию for word in ... для итерации по списку.
  • Используйте переменную для хранения промежуточного результата подсчета.
  • Используйте конструкцию letter in word для проверки наличия буквы в слове.

Задание 2

Зарегистрируйтесь на сайте https://www.pythonanywhere.com/.

Инструкция

Инструкция по работе с PythonАnywhere доступна по ссылке: https://github.com/netology-code/guides/blob/master/python%20anywhere/instruction.md

Любые вопросы по решению задач задавайте в чате в Telegram.

Я работаю над программой, в которой я проверяю, содержит ли слово, например: «Кот», букву. Для этого я попытался использовать if letter in word, но он не работает, когда я пытаюсь проверить наличие нескольких букв в слове, поскольку он проверяет, содержит ли слово каждую букву. Я также пробовал использовать re вот так

import re
bad_letters = "AKS"
word = "Sanctuary"

if re.match(bad_letters, word):
    print("It is a match")

Но это не работает

3 ответа

Лучший ответ

Вот решение с регулярным выражением:

import re
bad_letters = "AKS"
word = "Sanctuary"

if re.search(f"[{bad_letters}]", word, re.IGNORECASE):
    print("It is a match")

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

$ python3 -mtimeit -s 'bad_letters = "AKSaks"; word = "Sanctuary"' 'any(char in word for char in bad_letters)'
1000000 loops, best of 3: 0.468 usec per loop
$ python3 -mtimeit -s 'bad_letters = "AKS"; word = "Sanctuary"; import re' 're.search(f"[{bad_letters}]", word, re.IGNORECASE)'
1000000 loops, best of 3: 0.622 usec per loop

Фактически, часть времени, которое там измеряется, заключается в построении шаблона '[AKS]' из плохих символов 'AKS' и компиляции регулярного выражения. Если это исключить из измерения времени, то предварительно скомпилированное регулярное выражение легко выиграет.

$ python3 -mtimeit -s 'import re; bad_letters = "AKS"; matcher=re.compile(f"[{bad_letters}]", re.IGNORECASE).search; word = "Sanctuary"' 'matcher(word)'
10000000 loops, best of 3: 0.167 usec per loop


1

alani
11 Сен 2020 в 13:55

Если вы также хотите узнать, какая буква соответствует:

bad_letters="AKS".lower()
word="Sanctuary".lower()

for blet in bad_letters:
    for let in word:
        if blet==let:
            print("It is a match:",let)
            break


0

Dharman
11 Сен 2020 в 13:32

Я полагаю, вы хотели проверить наличие плохих букв в одной строке, чтобы вы могли:

    word = "hello"
    string = "EH"
    for letter in string:
        if letter.lower() in word.lower():
            print('success')
        else:
            print('failure')


0

Souhail Makni
11 Сен 2020 в 13:39

Я пытаюсь подсчитать количество раз «e» появляется в слове.

def has_no_e(word):     #counts 'e in a word
letters = len(word)
count = 0
while letters >= 0:
if word[letters-1] == 'e':
count = count + 1
letters = letters - 1
print count

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

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

Как уже упоминалось, вы можете реализовать тест с помощью простого word.count('e'). Если вы не делаете это как простое упражнение, это намного лучше, чем пытаться изобрести колесо.

Проблема с вашим кодом заключается в том, что он считает последний символ дважды, потому что вы тестируете индекс -1 в конце, который в Python возвращает последний символ в строке. Исправьте его, изменив while letters >= 0 на while letters > 0.

Есть другие способы, которыми вы можете убрать свой код (если это упражнение в обучении):

    Python обеспечивает отличный способ итерации по строке с использованием цикла for. Это гораздо более кратким и понятным для чтения, чем использование цикла while и сохранение собственной переменной счетчика. Как вы уже видели здесь, добавление сложности приводит к ошибкам. Держите это просто.
    Большинство языков предоставляют оператор +=, который для целых чисел добавляет сумму к переменной. Это более кратким, чем count = count + 1.
    Используйте параметр, чтобы определить, какой символ вы рассчитываете, чтобы сделать его более гибким. Определите аргумент по умолчанию для использования char='e' в списке параметров, когда у вас есть очевидное значение по умолчанию.
    Выберите более подходящее имя для функции. Имя has_no_e() заставляет читателя думать, что код проверяет, не содержит ли код e, но то, что он на самом деле делает, подсчитывает вхождения e.

Положив все это вместе, получим:

def count_letter(word, char='e'):
count = 0
for c in word:
if c == char:
count += 1
return count

Некоторые тесты:

>>> count_letter('tee')
2
>>> count_letter('tee', 't')
1
>>> count_letter('tee', 'f')
0
>>> count_letter('wh' + 'e'*100)
100

>>> word = 'eeeooooohoooooeee'
>>> word.count('e')
6

Почему не это?

Если вам действительно нужно «has_no_e», то следующее может быть более подходящим, чем подсчет «e», а затем проверка нуля,

def has_no_e(word):
return 'e' not in word

>>> has_no_e('Adrian')
True
>>> has_no_e('test')
False
>>> has_no_e('NYSE')
True

Если вы хотите проверить, нет ли «E»,

def has_no_e(word):
return 'e' not in word.lower()

>>> has_no_e('NYSE')
False

@marcog делает несколько отличных точек;

тем временем вы можете выполнить простую отладку, вставив операторы печати —

def has_no_e(word):
letters = len(word)
count = 0
while letters >= 0:
ch = word[letters-1] # what is it looking at?
if ch == 'e':
count = count + 1
print('{0} <-'.format(ch))
else:
print('{0}'.format(ch))
letters = letters - 1
print count

затем

has_no_e('tease')

возвращает

e <-
s
a
e <-
t
e <-
3

из которого вы можете видеть, что

    вы проходите строку в обратном порядке
    он правильно распознает e
    вы «обертываете» до конца строки — следовательно, дополнительный e, если ваша строка заканчивается на одном

Многие из предложенных решений будут работать нормально.

Знайте, что в Python список [-1] вернет последний элемент списка.

Итак, в вашем исходном коде, когда вы ссылались на слово [буквы-1] в цикле while, ограниченном буквами >= 0, вы считали бы «e» в конце слова дважды (один раз, когда буквы были длина-1 и второй раз, когда буквы были 0).

Например, если бы мое слово было «Пит», ваша дорожка кода выглядела бы так (если вы напечатали слово [письмо] каждый цикл.

e (для слова [3])
t (для слова [2])
e (для слова [1])
P (для слова [0])
e (для слова [-1])

Надеюсь, что это поможет прояснить ситуацию и выявить интересную небольшую причуду о Python.

Он будет считать это дважды, когда заканчивается на e, потому что вы уменьшаете letters один раз слишком много (потому что вы зацикливаете while letters >= 0, и вы должны зацикливаться, пока letters > 0). Когда letters достигает нуля, вы проверяете word[letters-1] == word[-1], который соответствует последнему символу в слове.

Проблема в том, что последнее значение «букв» в вашей итерации равно «0», и когда это происходит, вы смотрите:

  word[letters-1]

означает, что вы смотрите на слово [-1], которое в python означает «последняя буква слова».

так что вы на самом деле правильно подсчитываете и добавляете «бонус», если последняя буква «e».

Вам не нужно использовать цикл while. Строки могут использоваться для циклов в Python.

def has_no_e(word):
count = 0
for letter in word:
if letter == "e":
count += 1
print count

или что-то более простое:

def has_no_e(word):
return sum(1 for letter in word if letter=="e")

Почему бы просто не

def has_no_e(word):
return sum(1 for letter in word if letter=="e")

Введите минимум 50 символов

Like this post? Please share to your friends:
  • Let the word get out
  • Letter heads in word
  • Let the word fall out
  • Letter heading in word
  • Let the word do the work