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 |
5880 / 3340 / 1031 Регистрация: 03.11.2009 Сообщений: 9,965 |
|
19.11.2017, 04:11 |
2 |
Сообщение было отмечено Павел112233 как решение Решение заберите (input) одну строку в переменную вторую строку разбейте на слова (split), получится список циклом for пройдитесь по списку и проверяйте есть ли буква в очередном слове (letter in word)
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 как решение Решение
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 символов