2016-10-30 1 views
0

Je veux décoder des phrases entières du code Morse en alphabet normal - mon script fait juste cela, mais il joint tous les mots - il ne conserve pas les espaces. En MorseCode (l'entrée), trois espaces représentent la séparation entre les mots, tandis qu'un espace représente la séparation entre les lettres.Les caractères espaces blancs à la fois comme une clé et une valeur dans un dictionnaire

J'ai essayé d'ajouter trois espaces comme clé au dictionnaire avec la valeur correspondante d'un espace, mais cela ne semble pas fonctionner. J'ai également essayé de séparer l'entrée en utilisant des expressions régulières, mais j'ai échoué. Y a-t-il un moyen de le faire fonctionner en utilisant des dictionnaires? Est-il même possible d'utiliser les espaces blancs comme clés et entrées dans les dictionnaires?

Répondre

1

str.split() scinde une chaîne d'entrée sur un espace blanc de largeur arbitraire. Cela signifie que vous obtenez uniquement les sections de la chaîne qui sont et non les espaces (où les espaces incluent des espaces).

Vous devez normalement diviser l'entrée deux fois; une fois sur la chaîne ' ' pour obtenir une liste de mots, chaque mot sur les espaces pour recevoir uniquement les lettres:

def decodeMorse(morseCode): 
    return ' '.join([ 
     ''.join([MORSE_CODE.get(i) for i in word.split()]) 
     for word in morseCode.split(' ')]) 

Si vous voulez utiliser votre approche que vous auriez à utiliser une expression régulière pour diviser et comprennent séparateurs 3-espace:

re.split(r'([ ]{3}|)', morseCode) 

mais alors vous devez filtrer les séparateurs lettre-espace unique, comme re.split() peut inclure ou non le séparateur pour toute opération de division, non pas pour séparateur individuel Marqueurs.

+0

Merci, je comprends - il semble évident maintenant. Savez-vous si vous pouvez utiliser les espaces comme une clé et/ou une valeur dans un dictionnaire? Je n'ai trouvé aucune information. – 10001000101111

+0

Bien sûr, vous pouvez; c'est juste une chaîne. Le dictionnaire ne se soucie pas de ce qui est * dans * la chaîne. –

0

La fonction split considérera le triple espace comme un seul délimiteur. Donc, une option est de diviser d'abord explicitement sur l'espace triple, comme le suggère @Martijn Pieters, ou de remplacer d'abord le triple espace par un autre qui n'apparaît pas dans le code Morse (par exemple |), puis de le traduire en espace blanc:

def decodeMorse(morseCode): 
    MORSE_CODE['|'] = ' ' 
    return ''.join(MORSE_CODE.get(i) for i in morseCode.replace(' ', '|').split())