简体   繁体   English

数组的Pythonic映射(入门)

[英]Pythonic mapping of an array (Beginner)

I've got a question related to a beginner Python snippet I've written to introduce myself to the language. 我有一个与初学者Python代码段有关的问题,我已经编写了该代码段以向自己介绍该语言。 It's an admittedly trivial early effort, but I'm still wondering how I could have written it more elegantly. 这是早期公认的琐碎工作,但是我仍然想知道如何才能更优雅地编写它。

The program outputs NATO phoenetic readable versions of an argument, such "H2O" -> "Hotel 2 Oscar", or (lacking an argument) just outputs the whole alphabet. 该程序输出自变量的北约语音可读版本,例如“ H2O”->“ Hotel 2 Oscar”,或者(缺少自变量)仅输出整个字母。 I mainly use it for calling in MAC addresses and IQNs, but it's useful for other phone support too. 我主要将其用于呼叫MAC地址和IQN,但对其他电话支持也很有用。

Here's the body of the relevant portion of the program: 这是程序相关部分的主体:

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

As I mentioned, I just want to see suggestions for a more elegant way to code this. 正如我所提到的,我只想看到有关更优雅的编码方式的建议。 My first guess was to use a list comprehension along the lines of [nato[x] for x in sys.argv[1].lower() if x in nato] , but that doesn't allow me to output any non-alphabetic characters. 我的第一个猜测是对[nato[x] for x in sys.argv[1].lower() if x in nato] ,但是这不允许我输出任何非字母的字符。 My next guess was to use map , but I couldn't format any lambdas that didn't suffer from the same corner case. 我的下一个猜测是使用map ,但是我无法格式化不会受到相同拐角情况影响的任何lambda。

Any suggestions? 有什么建议么? Maybe something with first-class functions? 也许具有一流的功能? Messing with Array's guts? 迷恋数组的胆量?
This seems like it could almost be a Code Golf question, but I feel like I'm just overthinking :) 这似乎几乎是一个Code Golf问题,但我觉得我只是在想太多了:)

The dict get with default perhaps? 字典可能默认设置了吗?

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

使用上面的建议和生成器表达式可以一次完成所有操作

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

Here's a compact way of building your list: 这是一种构建列表的紧凑方法:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM