Как считать строку одна буква за один раз в Python

Я должен преобразовать строку, оценочную пользователем в азбуку Морзе. Путем наш преподаватель хочет, чтобы мы сделали, это должно читать из файла 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()   
11
задан dan 14 April 2010 в 03:39
поделиться

7 ответов

Вот вам пара вещей:

Загрузка будет "лучше", например:

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
4
ответ дан 3 December 2019 в 03:17
поделиться

Сначала создайте таблицу поиска:

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')]
1
ответ дан 3 December 2019 в 03:17
поделиться

Для фактической обработки я бы сохранил строку готового продукта и перебирал каждую букву в строке, которую они ввели. Я бы вызвал функцию для преобразования буквы в азбуку Морзе, а затем добавил бы ее в строку существующего кода Морзе.

finishedProduct = []
userInput = input("Enter text")
for letter in userInput:
    finishedProduct.append( letterToMorseCode(letter) )
theString = ''.join(finishedProduct)
print(theString)

Вы можете проверить наличие места в цикле или в вызываемой функции.

1
ответ дан 3 December 2019 в 03:17
поделиться
# 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)
1
ответ дан 3 December 2019 в 03:17
поделиться

Почему бы просто не перебрать строку?

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" ?

15
ответ дан 3 December 2019 в 03:17
поделиться
# 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)
2
ответ дан 3 December 2019 в 03:17
поделиться

Используйте "индекс".

def GetMorseCode(letter):
   index = letterList.index(letter)
   code = codeList[index]
   return code

Конечно, вы захотите проверить введенную букву (при необходимости преобразуйте ее регистр, убедитесь, что она находится в списке в первую очередь, проверив этот индекс! = -1), но это должно помочь вам .

2
ответ дан 3 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: