Как вывести слова из списка, содержащие в себе конкретную букву? 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 шт):

Автор решения: Sky
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()
→ Ссылка
Автор решения: Typeoflife
with open('words.txt') as file:
    words = file.readline().split()
    for word in words:
        if "c" in word:
            print(word)
→ Ссылка
Автор решения: Andy Pavlov

В Вашем случае Вы перепутали функцию 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)
→ Ссылка
Автор решения: MarianD

Вы усложняете себе жизнь:

  1. Вместо пары команд

    fin = open(...)
    fin.close() 
    

    лучше использовать так называемый контекст менеджер (команду with), который автоматическим закрывает файл после выхода из него:

    with open('words.txt') as fin:
        # Работа с файлом
        #   ...
    
    # Файл автоматически закрыт
    

    Этот подход имеет и другие преимущества — см. например объяснение 1 после моего решения ниже.
     

  2. Вместо пары команд

    read = fin.readlines()
    read_str = ''.join(read)
    

    вы могли просто применить метод .read():

    read_str = fin.read() 
    

    который читает весь файл сразу.
     

  3. Здесь ошибка:

    splited = read_str.strip()
    

    Вы наверно хотели применить метод .split() вместо .strip():

    splited = read_str.split()  
    
  1. Здесь также ошибки:

    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)

Объяснение:

  1. fin представляет собой итеративный объект по строкам файла, потому его возможно использовать прямо в цикле for.

  2. После применения метода .split() должно уничтожить возможную пунктуацию (точку, запятую, и тд.) из конца слова:

                if word.endswith(SYMBOLS):
                   word = word[:-1]  
    
  3. Метод .endswith() принимает как параметр не только строку, но и кортеж строк.

    Я создал такой кортеж из символов пунктуации — применением функции tuple() на строку из этих символов (которая рассматривается как итеративный объект по ее индивидуальных символах).

→ Ссылка