Не удается найти, существует ли значение в словаре из входных данных в Python

#python

#python

Вопрос:

 my_file = open("input.txt",'r')
d = {}
for line in my_file:
    key = line[0]
    if key not in d:
        d[key] = [line.strip("n")]
    else:
        d[key].append(line.strip("n"))

for key in d:
    print(key,d[key])
print("")
find_word = input("Search a word: ")
for value in d:
    if find_word in d.values():
       print("Word is found")
       break
    else:
        print("Word not found")
        break
  

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

Комментарии:

1. Почему у вас есть, for value in d: если вы никогда не используете value в цикле?

2. Возможно, строки в вашем файле имеют пробелы в конце. Попробуйте использовать line.strip() вместо line.strip("n") . Это удалит все окружающие пробелы.

3. values() само выдаст список, содержащий списки values . Другими словами, в итоге вы получаете вложенный список. Ваше слово не будет сравниваться равным ни одному из подсписков

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

5. Можете ли вы показать пример того, что находится в input.txt и что вы ищете?

Ответ №1:

Вы должны использовать d.values() в качестве списка для повторения в for цикле. Затем проверьте, есть ли искомое слово в каждом списке.

 for word_list in d.values():
    if find_word in word_list:
        print("Word is found")
        break
else:
    print("Word is not found")
  

Обратите внимание, что else: которое выводит, что слово не найдено, не должно быть в if , оно должно быть в for . Таким образом, сообщение выводится только в том случае, если ни один из списков в словаре не содержит это слово. else: Предложение цикла выполняется, если цикл завершается нормально, а не завершается с break .

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

 if any(find_word in word_list for word_list in d.values()):
    print("Word is found")
else:
    print("Word is not found")
  

Комментарии:

1. Это сделано намеренно. Прочитайте, что я написал сразу после этого.

2. Имена переменных wordlist и word_list не совпадают, что приводит к ошибке и

3. Это не находит слова, я попытался запустить его с образцом файла на моем локальном компьютере, когда вы доберетесь до if find_word в world_list, он точно соответствует, но значения «word_list» в этот момент не являются списком слов, это список строк, если он не ищет всю строку, это не сработает.

4. @ShailynOrtiz Я предположил, что файл состоит из одного слова в строке.

5. Нет, потому что d.values() это список списков.

Ответ №2:

Это на самом деле то, что вы ищете

 find_word = input("Search a word: ")
found = False

for _list in d.values():

    for element in _list:

        if element.find(find_word) != -1:

            print('Found')
            found = True
            break

    if found:
        break
else:
    print('Not found')
  

когда вы используете ключевое слово in для выполнения поиска, оно должно быть точным совпадением, поэтому, если вы это сделаете 'test' in ['test2', 'test3'] , оно будет равно false, поскольку это не точное совпадение, кроме того, значения в ваших словарных ключах представляют собой списки списков, а не списки 1 уровня, такие как:

dict_values([['text'], .... ['textn']])

в результате чего условие должно быть:

'word' in [[...], ..., [..]]

Это никогда не будет соответствовать.

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

Комментарии:

1. Проблема не в подстроках, она пытается сопоставить строки с подсписками

2. вы полностью правы @roganjosh, в моем ответе я исправил проблему с секундой для, я должен сделать это более понятным, позвольте мне отредактировать его, или вы хотели бы отредактировать мой ответ самостоятельно? С наилучшими пожеланиями

3. Значения в его словаре представляют собой списки строк, а не списки списков.

4. d[key].append(line.strip("n")) добавляет строку в список, но не добавляет список.

5. это верно, но если вы вызываете d.values(), он возвращает список list, который вы повторяете с первым для превращения каждого элемента в список