Питоническое отображение массива (Начинающий)

1

У меня есть вопрос, связанный с начинающим фрагментом Python, который я написал, чтобы представить себя на этом языке. Это, по общему признанию, тривиальное раннее усилие, но мне все еще интересно, как я мог бы написать его более элегантно.

Программа выводит факсимильно читаемые версии аргумента НАТО, такие как "H2O" → "Hotel 2 Oscar", или (без аргумента) просто выводит весь алфавит. Я в основном использую его для вызова MAC-адресов и IQN, но он полезен и для поддержки других телефонов.

Здесь тело соответствующей части программы:

#!/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,

Как я уже говорил, я просто хочу увидеть предложения для более элегантного способа кодирования этого. Мое первое предположение заключалось в том, чтобы использовать понимание списка в строках [nato[x] for x in sys.argv[1].lower() if x in nato], но это не позволяет мне выводить какие-либо неалфавитные символы. Мое следующее предположение заключалось в использовании map, но я не мог форматировать любые лямбды, которые не пострадали от одного и того же углового случая.

Любые предложения? Может быть, что-то с первоклассными функциями? Мессинг с массивными кишками?
Похоже, что это может быть вопрос Code Golf, но я чувствую, что просто переоцениваю:)

Теги:
arrays

3 ответа

5
Лучший ответ

возможно, по умолчанию?
for char in sys.argv[1].lower():
  print nato.get(char, char) # try to get nato[char] otherwise return char
3

Используя приведенное выше предложение и выражение генератора, чтобы сделать все это в одной строке

print ' '.join(nato.get(c,c) for c in sys.argv[1].lower())
  • 0
    +1 за все
  • 0
    Проголосовал, но я должен был отдать должное Extraneon. Спасибо! :)
2

Вот компактный способ построения списка:

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
    То, как вы инициализируете диктат НАТО, есть неявное требование, чтобы слова в строке НАТО были в алфавитном порядке (я знаю, что они уже есть). Я бы предпочел что-то вроде `nato = dict ((слово [0] .lower (), слово) для слова в НАТО). Ваша 'sierra' также строчная.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню