【问题标题】:Is there a fast way to generate a dict of the alphabet in Python?有没有一种快速的方法可以在 Python 中生成字母表的字典?
【发布时间】:2010-10-02 00:00:45
【问题描述】:

我想生成一个以字母为键的字典,比如

letter_count = {'a': 0, 'b': 0, 'c': 0}

什么是生成该字典的快速方法,而不是我必须输入它?

感谢您的帮助。

编辑
感谢大家的解决方案:)

nosklo's solution 可能是最短的

另外,感谢您提醒我有关 Python string 模块的信息。

【问题讨论】:

  • 以后你会用这个字典做什么?也许首先有一个更优雅的解决方案。

标签: python dictionary alphabet


【解决方案1】:

我觉得这个解决方案更优雅:

import string
d = dict.fromkeys(string.ascii_lowercase, 0)

【讨论】:

  • dict.fromkeys() 非常有用,您只需要注意使用可变对象(例如列表)作为值将存储该对象的 references在所有字典值中。
  • 多年来一直在编写 python 脚本,但不知何故我不知道...谢谢
  • @d.putto 因为dicts没有任何顺序,所以你拿回钥匙的顺序不是你可以依赖的。这对于字典来说是正常的。
  • @devtye {ch: n for n, ch in enumerate(string.ascii_lowercase)}
  • 如果您不想记住库名称并且不想使用显式导入语句,有一个更好的方法来做到这一点:d = {chr(x): 0 for x in range(ord('a'), ord('z')+1)}
【解决方案2】:
import string
letter_count = dict(zip(string.ascii_lowercase, [0]*26))

或者也许:

import string
import itertools
letter_count = dict(zip(string.lowercase, itertools.repeat(0)))

甚至:

import string
letter_count = dict.fromkeys(string.ascii_lowercase, 0)

首选的解决方案可能是不同的,具体取决于您在字典中想要的实际值。


我在这里猜一猜:您想计算文本(或类似内容)中字母的出现次数吗?有一个比从初始化字典开始更好的方法。

使用来自collections 模块的Counter

>>> import collections
>>> the_text = 'the quick brown fox jumps over the lazy dog'
>>> letter_counts = collections.Counter(the_text)
>>> letter_counts
Counter({' ': 8, 'o': 4, 'e': 3, ... 'n': 1, 'x': 1, 'k': 1, 'b': 1})

【讨论】:

  • string.lowercase 取决于语言环境。看我的回答。
  • 是的,当然。不过可能是我想要的(与第二个示例一起使用)
【解决方案3】:

如果你打算用它来计数,我建议如下:

import collections
d = collections.defaultdict(int)

【讨论】:

    【解决方案4】:

    这是一个精简版,使用list comprehension

    >>> import string
    >>> letter_count = dict( (key, 0) for key in string.ascii_lowercase )
    >>> letter_count
    {'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0,
     'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 
    't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
    

    【讨论】:

    • 你有一对额外的括号:dict() 中的括号足以让解析器理解生成器表达式。
    【解决方案5】:

    又一个 1-liner Python hack:

    letter_count = dict([(chr(i),0) for i in range(97,123)])
    

    【讨论】:

    • 绝对是一个黑客。至少,使用 range(ord('a'), ord('z')+1)。这至少向读者描述了意图。
    • 哦,让我休息一下。它被描述为 1-liner hack。
    • d = {chr(x): 0 for x in range(ord('a'), ord('z')+1)}这个更简洁
    【解决方案6】:

    很容易理解字典:{chr(i+96):i for i in range(1,27)} 生成:

    {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}

    您可以使用 chr(i+64) 为大写字母 A-Z 生成相同的内容

    【讨论】:

      【解决方案7】:

      还有这个:

      import string
      letter_count = dict((letter, 0) for letter in string.ascii_lowercase)
      

      【讨论】:

      • 使用string.ascii_lowercase。如果您错过了(输入两次)一封信怎么办? 6个月后,你现在怎么说? string.ascii_lowercase没有这样的问题。
      • 谢谢。我一直在寻找它,但在我正在寻找的 string.lowercase 下找不到它。
      【解决方案8】:
      import string
      letters = string.ascii_lowercase
      d = dict(zip(letters, [0]*len(letters))
      

      【讨论】:

        【解决方案9】:

        您可以直接使用字典和范围,因此您可以创建自己的函数并轻松自定义。

        def gen_alphabet(start, value):
            return {chr(ord('a') + i) : 0 for i in range(value)}
        
        print(gen_alphabet('a', 26))
        

        输出:

        >>> {'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0, 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
        

        【讨论】:

          【解决方案10】:
          import string
          s =string.ascii_lowercase 
          s1 =string.ascii_uppercase
          s2=string.ascii_letters
          print(dict(enumerate(s,1))) 
          print(dict(enumerate(s1,1)))
          print(dict(enumerate(s2,1)))
          

          【讨论】:

            【解决方案11】:

            我的变种:

            注意:Unicode 中的 A-Z 范围 => 65-90(十进制)

            d = dict.fromkeys([chr(j) for j in range(65, 90)], 0)
            print(d)
            

            输出:

            >>> {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0}
            

            【讨论】:

              【解决方案12】:
              a_to_z = [(chr(i+64), chr(i+64)) for i in range(1, 27)]
              

              输出

              [('A', 'A'), ('B', 'B'), ('C', 'C'), ('D', 'D'), ('E', 'E'), ('F', 'F'), ('G', 'G'), ('H', 'H'), ('I', 'I'), ('J', 'J'), ('K', 'K'), ('L', 'L'), ('M', 'M'), ('N', 'N'), ('O', 'O'), ('P', 'P'), ('Q', 'Q'), ('R', 'R'), ('S', 'S'), ('T', 'T'), ('U', 'U'), ('V', 'V'), ('W', 'W'), ('X', 'X'), ('Y', 'Y'), ('Z', 'Z')]
              

              【讨论】:

              • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
              猜你喜欢
              • 2021-12-13
              • 2016-03-11
              • 2018-01-07
              • 1970-01-01
              • 2010-10-03
              • 1970-01-01
              • 2020-11-23
              • 1970-01-01
              • 2011-02-04
              相关资源
              最近更新 更多