#python #python-3.x
#python #python-3.x
Вопрос:
Я работаю над небольшой проблемой для развлечения, присланной мне другом. Проблема требует, чтобы я заполнил массив общими словами из текстового файла, а затем распечатал все слова из этого списка, содержащие определенные символы, предоставленные пользователем. Я могу без проблем заполнить свой массив, но, похоже, часть кода, которая фактически сравнивает два списка, не работает. Ниже приведена функция, которую я написал для сравнения 2 списков.
#Function that prompts user for the set of letters to match and then compares that list of letters to each word in our wordList.
def getLetters():
#Prompt user for list of letters and convert that string into a list of characters
string = input("Enter your target letters: ")
letterList = list(string)
#For each word in the wordList, loop through each character in the word and check to see if the character is in our letter list, if it is increase matchCount by 1.
for word in wordList:
matchCount = 0
for char in word:
if char in letterList:
matchCount =1
#If matchCount is equal to the length of the word, all of the characters in the word are present in our letter list and the word should be added to our matchList.
if matchCount == len(word):
matchList.append(word)
print(matchList)
Код работает просто отлично, я не получаю никаких выходных данных об ошибках, но как только пользователь вводит свой список букв, ничего не происходит. Для тестирования я попробовал несколько входных данных, совпадающих со словами, которые, как я знаю, есть в моем списке слов (например, added, axe, tree и т. Д.). Но после ввода моей буквенной строки ничего не печатается.
Вот как я заполняю свой список слов:
def readWords(filename):
try:
with open(filename) as file:
#Load entire file as string, split string into word list using whitespace as delimiter
s = file.read()
wordList = s.split(" ")
getLetters()
#Error handling for invalid filename. Just prompts the user for filename again. Should change to use ospath.exists. But does the job for now
except FileNotFoundError:
print("File does not exist, check directory and try again. Dictionary file must be in program directory because I am bad and am not using ospath.")
getFile()
Редактировать: изменена функция для сброса matchCount на 0, прежде чем она начнет перебирать символы, вывода по-прежнему нет.
Комментарии:
1. Вот совет: есть умное, гораздо более простое решение, которое использует наборы Python. Эта проблема является хорошей демонстрацией того, насколько крутым может быть Python несколько раз. 😉
Ответ №1:
Ваш код нуждается только в простом изменении:
Передайте список слов в качестве параметра для getLetters
. Также, если хотите, вы можете внести изменения, чтобы узнать, все ли буквы слова находятся в списке букв.
def getLetters(wordList):
string = input("Enter your target letters: ")
letterList = list(string)
matchList = []
for word in wordList:
if all([letter in letterList for letter in word]):
matchList.append(word)
return matchList
И в readWords
:
def readWords(filename):
try:
with open(filename) as file:
s = file.read()
wordList = s.split(" ")
result = getLetters(wordList)
except FileNotFoundError:
print("...")
else:
# No exceptions.
return result
Ответ №2:
Редактировать: добавьте глобальное объявление для изменения вашего списка внутри функции:
wordList = [] #['axe', 'tree', 'etc']
def readWords(filename):
try:
with open(filename) as file:
s = file.read()
global wordList # must add to modify global list
wordList = s.split(" ")
except:
pass
Вот рабочий пример:
wordList = ['axe', 'tree', 'etc']
# Function that prompts user for the set of letters to match and then compares that list of letters to each word in our wordList.
def getLetters():
# Prompt user for list of letters and convert that string into a list of characters
string = input("Enter your target letters: ")
letterList = list(string)
# For each word in the wordList, loop through each character in the word and check to see if the character is in our letter list, if it is increase matchCount by 1.
matchList = []
for word in wordList:
matchCount = 0
for char in word:
if char in letterList:
matchCount = 1
# If matchCount is equal to the length of the word, all of the characters in the word are present in our letter list and the word should be added to our matchList.
if matchCount == len(word):
matchList.append(word)
print(matchList)
getLetters()
вывод:
Enter your target letters: xae
['axe']
Комментарии:
1. Хм. Единственное различие, которое я вижу здесь, заключается в вашем списке слов. В настоящее время мой извлекается из текстового файла, содержащего общие слова, разделенные пробелами.
python def readWords(filename): try: with open(filename) as file: #Load entire file as string, split string into word list using whitespace as delimiter s = file.read() wordList = s.split(" ") getLetters()
Есть ли причина, по которой это все сломает?2. я думаю, вам следует распечатать свой список слов после загрузки значений из вашего файла, чтобы проверить, правильно ли он загружен или нет
3. Я сделал это, он печатает весь список из 10 тысяч слов.
4. также вам необходимо сбрасывать «matchCount = 0» перед каждым совпадением, проверьте мой ответ, я добавил эту строку непосредственно перед «для символа в word:»
5. Да, я уже отредактировал свой OP, чтобы отразить это изменение. Для меня это ничего не изменило:(