Как вывести слова из списка, содержащие в себе конкретную букву? Python
При работе с файлом возникла необходимость вывести все слова из файла, содержащие в себе букву "с". Мой приложенный код выводит букву "i" столько раз сколько эти слова встретились ей в переборе. Как вывести слова с заданным параметром? В чем моя ошибка?
Буду рад любым полезным комментариям
fin = open('words.txt', 'r+')
read = fin.readlines()
read_str = ''.join(read)
splited = read_str.strip()
for i in splited:
if i == 'с':
print(i)
fin.close()
Ответы (4 шт):
fin = open('words.txt', 'r+')
read = fin.readlines()
read_str = ''.join(read)
splited = read_str.split()
df = []
for i in splited:
for ind in i:
if ind =='a':
if i not in df:
df.append(i)
print(df)
fin.close()
with open('words.txt') as file:
words = file.readline().split()
for word in words:
if "c" in word:
print(word)
В Вашем случае Вы перепутали функцию str.split() с функцией str.strip(), и после начинаете побуквенно перебирать единую строку. Дальше, когда Вы находите букву в слове, то Вы выводите букву. Надо искать слово, которое включает букву. Еще хорошо бы приводить все слова к строчным, иначе заглавные буквы будут пропущены.
Немного причесал Ваш код:
letter = 'a'
with open('words.txt') as file:
read = file.readlines()
read_str = ''.join(read).lower()
splited = read_str.split()
for i in splited:
if letter in i:
print(i)
Его же можно сделать чуть более читаемым
letter = 'a'
with open('words.txt') as file:
text = ' '.join(file.readlines()).lower().split(' ') # Предположим, что слова идут через пробел и разбиты на строки
filtered = [word for word in text if letter in word]
print(*filtered, sep='\n')
Еще вариант, чтобы лишний раз текст не бить, можно воспользоваться регулярными выражениями:
import re
letter = 'A'
with open('words.txt') as file:
words = re.findall(
f'[\s\W]*(\w*{letter}\w*)[\s\W]*', file.read(), re.IGNORECASE)
Вы усложняете себе жизнь:
Вместо пары команд
fin = open(...) fin.close()лучше использовать так называемый контекст менеджер (команду
with), который автоматическим закрывает файл после выхода из него:with open('words.txt') as fin: # Работа с файлом # ... # Файл автоматически закрытЭтот подход имеет и другие преимущества — см. например объяснение 1 после моего решения ниже.
Вместо пары команд
read = fin.readlines() read_str = ''.join(read)вы могли просто применить метод
.read():read_str = fin.read()который читает весь файл сразу.
Здесь ошибка:
splited = read_str.strip()Вы наверно хотели применить метод
.split()вместо.strip():splited = read_str.split()
Здесь также ошибки:
for i in splited: if i == 'с': print(i)print(i)выводит то, что находится в переменнойi, а в переменнойi- выполняя условиеi == 'с'- находится букваc.Предполагая, что в переменной
iнаходится слово (а не символ — см. предыдущий пункт 3), нужно тестировать не на равенство (==), а на вхождение (in):*for i in splited: if 'с' in i: print(i)Имя переменной может помочь, но и запутать:
Что такое
i? Слово? Так почему не назвать егоword?Что такое
splitted? Список слов? Так почему не назвать егоwords?for word in words: if 'с' in word: print(word)
Я бы решил вашу задачу так:
LETTER = "c"
SYMBOLS = tuple(",;:.?!")
FILENAME = "words.txt"
with open(FILENAME) as fin:
for line in fin:
for word in line.split():
if LETTER in word:
if word.endswith(SYMBOLS):
word = word[:-1]
print(word)
Объяснение:
finпредставляет собой итеративный объект по строкам файла, потому его возможно использовать прямо в циклеfor.После применения метода
.split()должно уничтожить возможную пунктуацию (точку, запятую, и тд.) из конца слова:if word.endswith(SYMBOLS): word = word[:-1]Метод
.endswith()принимает как параметр не только строку, но и кортеж строк.Я создал такой кортеж из символов пунктуации — применением функции
tuple()на строку из этих символов (которая рассматривается как итеративный объект по ее индивидуальных символах).