Я должен преобразовать строку, оценочную пользователем в азбуку Морзе. Путем наш преподаватель хочет, чтобы мы сделали, это должно читать из файла morseCode.txt, разделить буквы от morseCode в два списка, затем преобразовать каждую букву в азбуку Морзе (вставка новой строки, когда существует пространство).
У меня есть начало. То, что это делает, является чтениями файл morseCode.txt и разделяет буквы в список [A, B... Z] и коды в список ['–.. –\n', '. –. –. –\n'...].
Мы еще не изучили "наборы", таким образом, я не могу использовать это. Как я затем взял бы строку, что они оценочный, пройдите побуквенный, и преобразуйте ее в азбуку Морзе? Я немного схвачен. Вот то, что я имею прямо сейчас (не очень вообще...)
Править: завершенный программа!
# open morseCode.txt file to read
morseCodeFile = open('morseCode.txt', 'r') # format is <letter>:<morse code translation><\n>
# create an empty list for letters
letterList = []
# create an empty list for morse codes
codeList = []
# read the first line of the morseCode.txt
line = morseCodeFile.readline()
# while the line is not empty
while line != '':
# strip the \n from the end of each line
line = line.rstrip()
# append the first character of the line to the letterList
letterList.append(line[0])
# append the 3rd to last character of the line to the codeList
codeList.append(line[2:])
# read the next line
line = morseCodeFile.readline()
# close the file
morseCodeFile.close()
try:
# get user input
print("Enter a string to convert to morse code or press <enter> to quit")
userInput = input("")
# while the user inputs something, continue
while userInput:
# strip the spaces from their input
userInput = userInput.replace(' ', '')
# convert to uppercase
userInput = userInput.upper()
# set string accumulator
accumulateLetters = ''
# go through each letter of the word
for x in userInput:
# get the index of the letterList using x
index = letterList.index(x)
# get the morse code value from the codeList using the index found above
value = codeList[index]
# accumulate the letter found above
accumulateLetters += value
# print the letters
print(accumulateLetters)
# input to try again or <enter> to quit
print("Try again or press <enter> to quit")
userInput = input("")
except ValueError:
print("Error in input. Only alphanumeric characters, a comma, and period allowed")
main()
Вот вам пара вещей:
Загрузка будет "лучше", например:
with file('morsecodes.txt', 'rt') as f:
for line in f:
line = line.strip()
if len(line) > 0:
# do your stuff to parse the file
Таким образом, вам не нужно будет закрывать, и вам не нужно вручную загружать каждую строку и т. Д. и т. д.
for letter in userInput:
if ValidateLetter(letter): # you need to define this
code = GetMorseCode(letter) # from my other answer
# do whatever you want
Сначала создайте таблицу поиска:
morse = [None] * (ord('z') - ord('a') + 1)
for line in moreCodeFile:
morse[ord(line[0].lower()) - ord('a')] = line[2:]
Затем преобразуйте, используя таблицу:
for ch in userInput:
print morse[ord(ch.lower()) - ord('a')]
Для фактической обработки я бы сохранил строку готового продукта и перебирал каждую букву в строке, которую они ввели. Я бы вызвал функцию для преобразования буквы в азбуку Морзе, а затем добавил бы ее в строку существующего кода Морзе.
finishedProduct = []
userInput = input("Enter text")
for letter in userInput:
finishedProduct.append( letterToMorseCode(letter) )
theString = ''.join(finishedProduct)
print(theString)
Вы можете проверить наличие места в цикле или в вызываемой функции.
# Open the file
f = open('morseCode.txt', 'r')
# Read the morse code data into "letters" [(lowercased letter, morse code), ...]
letters = []
for Line in f:
if not Line.strip(): break
letter, code = Line.strip().split() # Assuming the format is <letter><whitespace><morse code><newline>
letters.append((letter.lower(), code))
f.close()
# Get the input from the user
# (Don't use input() - it calls eval(raw_input())!)
i = raw_input("Enter a string to be converted to morse code or press <enter> to quit ")
# Convert the codes to morse code
out = []
for c in i:
found = False
for letter, code in letters:
if letter == c.lower():
found = True
out.append(code)
break
if not found:
raise Exception('invalid character: %s' % c)
# Print the output
print ' '.join(out)
Почему бы просто не перебрать строку?
a_string="abcd"
for letter in a_string:
print letter
возвращает
a
b
c
d
Итак, в псевдо-коде я бы сделал следующее:
user_string = raw_input()
list_of_output = []
for letter in user_string:
list_of_output.append(morse_code_ify(letter))
output_string = "".join(list_of_output)
Примечание: Функция morse_code_ify
является псевдокодом.
Вы определенно хотите составить список символов, которые вы хотите вывести, а не просто объединять их в конце некоторой строки. Как указано выше, это O (n ^ 2): плохо. Просто добавьте их в список, а затем используйте "". Join (the_list)
.
В качестве примечания: почему вы удаляете пробелы? Почему бы просто не morse_code_ify ("")
вернуть "\ n"
?
# Retain a map of the Morse code
conversion = {}
# Read map from file, add it to the datastructure
morseCodeFile = file('morseCode.txt')
for line in moreCodeFile:
conversion[line[0]] = line[2:]
morseCodeFile.close()
# Ask for input from the user
s = raw_input("Please enter string to translate")
# Go over each character, and print it the translation.
# Defensive programming: do something sane if the user
# inputs non-Morse compatible strings.
for c in s:
print conversion.get(c, "No translation for "+c)
Используйте "индекс".
def GetMorseCode(letter):
index = letterList.index(letter)
code = codeList[index]
return code
Конечно, вы захотите проверить введенную букву (при необходимости преобразуйте ее регистр, убедитесь, что она находится в списке в первую очередь, проверив этот индекс! = -1), но это должно помочь вам .