【问题标题】:How to create a dict with letters as keys in a concise way?如何以简洁的方式创建以字母为键的字典?
【发布时间】:2014-08-20 22:43:42
【问题描述】:

我创建了一个包含 26 个字母的字典,如下所示:

aDict={
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    etc...
}

我正在努力使我的代码更好,我的问题是, 有没有更短的方法可以在不输入所有这些数字的情况下做到这一点?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您可以在此处使用string.ascii_lowercase 和dict理解。

    In [4]: from string import ascii_lowercase as al
    

    对于 Python 2.7+:

    In [5]: dic = {x:i for i, x in enumerate(al, 1)}
    

    对于 Python 2.6 或更早版本:

    In [7]: dic = dict((y, x) for x, y in enumerate(al, 1))
    

    【讨论】:

    • 如何截断字母表,比如说,只有 10 个字母?
    • @Sigur 在传递给枚举之前先切片?
    • 你的意思是分割dic
    【解决方案2】:
    aDict = dict(zip('abcdefghijklmnopqrstuvwxyz', range(1, 27)))
    

    或者代替硬编码字母表:

    import string
    aDict = dict(zip(string.ascii_lowercase, range(1, 27)))
    

    【讨论】:

    • 如果你不打算硬编码字母表,我建议不要硬编码它的长度,压缩到itertools.count(1)range(1, 1+len(string.ascii_lowercase))
    【解决方案3】:

    试试这个,它适用于 Python 2.6 及更早版本:

    from string import ascii_lowercase
    d = {}
    for i, c in enumerate(ascii_lowercase, 1):
        d[c] = i
    

    如果您使用的是 Python 2.7 或更高版本,则可以使用 dictionary comprehension

    d = {c : i for i, c in enumerate(ascii_lowercase, 1)}
    

    【讨论】:

      【解决方案4】:

      使用ord()函数可以找到一个字符的ascii值,反之为chr()

      >>> ord('a')
      97
      

      然后您可以从 ascii 值创建字典,如下所示:

      for i in range(97, 97+26):
          x[chr(i)] = i - 96 
      

      【讨论】:

        【解决方案5】:

        Python 2.7 及以上版本:

        import string
        
        letters = {k: v for v, k in enumerate(string.ascii_lowercase, 1)}
        

        Python 2.6 及以下:

        import string
        
        letters = dict((k, v) for v, k in enumerate(string.ascii_lowercase, 1))
        

        【讨论】:

        • 这不只是@Ashwini 的回答吗? [我也经常发生。]
        • @DSM 几乎......对于这样的事情总会有一些欺骗或接近欺骗的答案。我喜欢想象每个人都在疯狂地打字以首先到达那里:-)实际上我认为对于这类问题它有点有用;它让没有经验的读者清楚哪些是惯用的解决方案,哪些不是。
        猜你喜欢
        • 2017-04-25
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多