#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, который вы повторяете с первым для превращения каждого элемента в список