2010-04-05 6 views
1

J'ai une question liée à un extrait de Python pour débutant que j'ai écrit pour me présenter à la langue. C'est un premier effort certes trivial, mais je me demande toujours comment j'aurais pu l'écrire plus élégamment. Le programme affiche les versions lisible phoenetic de l'OTAN d'un argument, tel que "H2O" -> "Hotel 2 Oscar", ou (sans argument) sort tout l'alphabet. Je l'utilise principalement pour appeler des adresses MAC et des IQN, mais c'est utile pour d'autres types de support téléphonique.Mappage Pythonic d'un tableau (Débutant)

est ici le corps de la partie pertinente du programme:

#!/usr/bin/env python 

import sys 

nato = { 
"a": 'Alfa', 
"b": 'Bravo', 
"c": 'Charlie', 
"d": 'Delta', 
"e": 'Echo', 
"f": 'Foxtrot', 
"g": 'Golf', 
"h": 'Hotel', 
"i": 'India', 
"j": 'Juliet', 
"k": 'Kilo', 
"l": 'Lima', 
"m": 'Mike', 
"n": 'November', 
"o": 'Oscar', 
"p": 'Papa', 
"q": 'Quebec', 
"r": 'Romeo', 
"s": 'Sierra', 
"t": 'Tango', 
"u": 'Uniform', 
"v": 'Victor', 
"w": 'Whiskey', 
"x": 'Xray', 
"y": 'Yankee', 
"z": 'Zulu', 
} 

if len(sys.argv) < 2: 
    for n in nato.keys(): 
      print nato[n] 
else: 
    # if sys.argv[1] == "-i" # TODO 
    for char in sys.argv[1].lower(): 
      if char in nato: 
        print nato[char], 
      else: print char, 

Comme je l'ai mentionné, je veux juste voir des suggestions pour un moyen de code plus élégant cela. Ma première supposition était d'utiliser une compréhension de liste le long des lignes de [nato[x] for x in sys.argv[1].lower() if x in nato], mais cela ne me permet pas de sortir des caractères non-alphabétiques. Ma prochaine estimation était d'utiliser map, mais je ne pouvais pas mettre en forme de lambdas qui ne souffraient pas du même cas.

Des suggestions? Peut-être quelque chose avec des fonctions de première classe? Messing avec les tripes de Array?
Cela semble être presque une question de Code Golf, mais je pense que je suis juste en train de réfléchir :)

Répondre

5

Le dict get with default peut-être?

for char in sys.argv[1].lower(): 
    print nato.get(char, char) # try to get nato[char] otherwise return char 
3

En utilisant la suggestion ci-dessus et une expression de générateur pour le faire en une seule ligne

print ' '.join(nato.get(c,c) for c in sys.argv[1].lower()) 
+0

+1 pour tout espaçant – thetaiko

+0

Upvoted, mais je devais donner crédit à Extraneon. Merci! :) –

2

est ici une façon compacte de la construction de votre liste:

import sys 
import string 

NATO = '''Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet 
Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform 
Victor Whiskey X-Ray Yankee Zulu'''.split() 

nato = dict(zip(string.lowercase,NATO)) 

if len(sys.argv) < 2: 
    for n in nato: 
     print n,nato[n] 
else: 
    for char in sys.argv[1].lower(): 
     print nato.get(char,char) 
+0

La façon dont vous initialisez l'OTAN, il y a une exigence implicite que les mots de la chaîne OTAN sont dans l'ordre alphabétique (je sais qu'ils le sont déjà). Je préférerais quelque chose comme 'nato = dict ((mot [0] .lower(), mot) pour mot à l'OTAN). Votre 'sierra' est également en minuscule. – tzot