Comment lire une chaîne une lettre à la fois en python

j'ai besoin de convertir une chaîne entrée par un utilisateur en code morse. La façon dont notre professeur veut que nous fassions cela est de lire à partir d'un code Morsi.fichier txt, séparer les lettres du morseCode en deux listes, puis convertir chaque lettre en code morse (en insérant une nouvelle ligne quand il y a un espace).

j'ai le début. Ce qu'il fait, c'est lire le morseCode.TXT et sépare les lettres en une liste [A, b, ... Z] et les codes dans une liste ['– – . . - - n','. – . – . - n'...].

nous n'avons pas encore appris "sets", donc je ne peux pas l'utiliser. Comment pourrais-je alors prendre la chaîne qu'ils ont Entrée, passer par lettre par lettre, et la convertir en code morse? Je suis un peu rattrapé. Voici ce que j'ai en ce moment (pas beaucoup du tout...)

modifier: terminé le programme!

# 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()   
6
demandé sur dan 2010-04-14 03:41:50

8 réponses

pourquoi ne pas simplement itérer à travers la chaîne?

a_string="abcd"
for letter in a_string:
    print letter

retourne

a
b
c
d

donc, en pseudo-code, je ferais ceci:

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)

Note: la fonction morse_code_ify est un pseudo-code.

Vous certainement voulez faire une liste des personnages que vous voulez à la production plutôt que la concaténation de sur le sur le bout d'une chaîne de caractères. Comme indiqué ci-dessus, il est O (N^2): mauvais. Il suffit de les ajouter à une liste, puis d'utiliser "".join(the_list) .

comme note secondaire: pourquoi supprimez-vous les espaces? Pourquoi ne pas simplement avoir morse_code_ify(" ") retourner un "\n" ?

11
répondu mellort 2010-04-14 00:34:19

deux ou trois choses pour toi:

Le chargement serait "mieux" comme ceci:

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

de Cette façon, vous n'avez pas besoin de fermer, et vous n'avez pas besoin de charger manuellement chaque ligne, etc., etc.

for letter in userInput:
   if ValidateLetter(letter):  # you need to define this
      code = GetMorseCode(letter)  # from my other answer
      # do whatever you want
4
répondu dash-tom-bang 2010-04-14 13:52:24

utiliser "index".

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

bien sûr, vous voudrez valider votre lettre de saisie (convertir son cas si nécessaire, assurez-vous qu'il est dans la liste en premier lieu en vérifiant cet index != -1), mais cela devrait vous conduire sur le chemin.

2
répondu dash-tom-bang 2010-04-13 23:48:57
# 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
répondu moshez 2010-04-13 23:53:43

Je ne peux pas laisser cette question dans cet état avec le code final dans la question suspendue au-dessus de moi...

dan: voici une version plus claire et plus courte de votre code. Ce serait une bonne idée d'examiner comment cela est fait et de coder davantage de cette façon à l'avenir. Je sais que vous n'avez probablement plus besoin de ce code, mais apprendre comment vous devez le faire est une bonne idée. Certaines choses à noter:

  • il n'y a que deux commentaires - et même la seconde n'est pas vraiment nécessaire pour quelqu'un de familier avec Python, ils réaliseront que NL est dépouillé. N'écrivez des commentaires que si cela ajoute de la valeur.

  • l'énoncé with (recommandé dans une autre réponse) supprime la difficulté de fermer le fichier par le gestionnaire de contexte.

  • utilisez un dictionnaire au lieu de deux listes.

  • un générateur de compréhension ( (x for y in z) ) est utilisé pour faire la traduction en une ligne.

  • Wrap que peu de code que vous pouvez dans un try / except bloc à réduire la probabilité d'attraper une exception que vous ne vouliez pas.

  • utilisez l'argument input() plutôt que print() ing first - Use '\n' pour obtenir la nouvelle ligne que vous voulez.

  • N'écrivez pas de code sur plusieurs lignes ou avec des variables intermédiaires comme celles-ci juste pour le plaisir:

    a = a.b()
    a = a.c()
    b = a.x()
    c = b.y()
    

    à la place, écrivez ces constructions comme ceci, enchaînant les appels comme il est parfaitement valide:

    a = a.b().c()
    c = a.x().y()
    

code = {}
with open('morseCode.txt', 'r') as morse_code_file:
    # line format is <letter>:<morse code translation>
    for line in morse_code_file:
        line = line.rstrip()  # Remove NL
        code[line[0]] = line[2:]

user_input = input("Enter a string to convert to morse code or press <enter> to quit\n")
while user_input:
    try:
        print(''.join(code[x] for x in user_input.replace(' ', '').upper()))
    except KeyError:
        print("Error in input. Only alphanumeric characters, a comma, and period allowed")

    user_input = input("Try again or press <enter> to quit\n")
2
répondu Chris Morgan 2010-11-30 02:18:06
# 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
répondu cryo 2010-04-14 00:11:58

pour le traitement réel je garderais une chaîne de produit fini, et boucle à travers chaque lettre dans la chaîne qu'ils ont entré. J'appellerais une fonction pour convertir une lettre en code morse, puis l'ajouter à la chaîne de code morse existant.

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

, Vous pouvez vérifier pour l'espace dans la boucle, ou dans la fonction qui est appelée.

1
répondu Davis 2010-04-14 15:23:08

créer une table de recherche en premier:

morse = [None] * (ord('z') - ord('a') + 1)
for line in moreCodeFile:
    morse[ord(line[0].lower()) - ord('a')] = line[2:]

puis convertir en utilisant la table:

for ch in userInput:
    print morse[ord(ch.lower()) - ord('a')]
1
répondu hamax 2012-11-14 15:58:31