如何用简洁的方式创建一个以字母为键的字典?

8

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

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

我正在尝试改进我的代码,我的问题是,有没有更简短的方法来完成这个任务,而不需要逐个输入所有这些数字?

5个回答

17

您可以在此处使用 string.ascii_lowercase 和字典推导。

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
在传递给enumerate之前对其进行切片? - Ashwini Chaudhary
你的意思是“切片 dic”吗? - Sigur

6
aDict = dict(zip('abcdefghijklmnopqrstuvwxyz', range(1, 27)))

或者可以不用硬编码字母表:

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

3
如果您不打算硬编码字母表,我建议不要硬编码其长度,而是使用itertools.count(1)range(1, 1+len(string.ascii_lowercase))进行压缩。 - pilcrow

2

尝试这个,在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)}

1

您可以使用ord()函数找到字符的ASCII值,反之使用chr()函数:

>>> ord('a')
97

你可以按以下方式从ASCII值创建一个字典:
for i in range(97, 97+26):
    x[chr(i)] = i - 96 

1

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
@DSM 基本上...像这样的问题总会有一些重复或接近重复的答案。我喜欢想象每个人都在疯狂地打字,争先恐后地回答 :-) 实际上,我认为对于这种类型的问题来说,这是有点有用的;它可以清楚地告诉没有经验的读者哪些是惯用的解决方案,哪些不是。 - Zero Piraeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接