【问题标题】:Pythonic mapping of an array (Beginner)数组的 Pythonic 映射(初学者)
【发布时间】:2010-04-05 19:58:20
【问题描述】:

我有一个与初学者 Python sn-p 相关的问题,我写这个问题是为了向自己介绍这门语言。这是一个公认的微不足道的早期努力,但我仍然想知道如何才能更优雅地编写它。

程序输出参数的 NATO 语音可读版本,例如“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,但我无法格式化任何不受相同极端情况影响的lambda。

有什么建议吗?也许具有一流功能的东西?惹恼了 Array 的胆量?
这似乎几乎是一个代码高尔夫问题,但我觉得我只是想多了:)

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    dict get with default 可能吗?

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

    【讨论】:

      【解决方案2】:

      使用上述建议和生成器表达式在一行中完成所有操作

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

      【讨论】:

        【解决方案3】:

        以下是构建列表的简洁方式:

        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)
        

        【讨论】:

        • 初始化 nato dict 的方式有一个隐含的要求,即 NATO 字符串中的单词按字母顺序排列(我知道它们已经是)。我更喜欢 `nato = dict( (word[0].lower(), word) for word in NATO) 之类的东西。您的 'sierra' 也是小写的。
        猜你喜欢
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 2017-03-26
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多