Python 字典推导式

523 投票
9 回答
538309 浏览
提问于 2025-04-17 13:33

在Python中,可以创建字典推导式吗(用于键)?

如果不使用列表推导式,你可以这样做:

l = []
for n in range(1, 11):
    l.append(n)

我们可以把这个简化成一个列表推导式:l = [n for n in range(1, 11)]

但是,假设我想把字典的键设置为相同的值。我可以这样做:

d = {}
for n in range(1, 11):
     d[n] = True # same value for each

我试过这个:

d = {}
d[i for i in range(1, 11)] = True

但是,我在for那儿遇到了SyntaxError错误。

另外(虽然我不需要这部分,但只是想问问),你能把字典的键设置为一堆不同的值吗,比如这样:

d = {}
for n in range(1, 11):
    d[n] = n

这在字典推导式中可行吗?

d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]

这同样在for那儿引发了SyntaxError错误。

9 个回答

35

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,我们希望程序能做出反应。这种情况通常会用到“事件”这个概念。

事件就像是一个信号,告诉程序某件事情发生了。比如,用户点击鼠标、按下键盘,或者页面加载完成,这些都是事件。当这些事件发生时,程序会根据预先设定的规则来执行相应的操作。

为了让程序能够处理这些事件,我们通常会写一些“监听器”。监听器就像是一个守卫,时刻关注着事件的发生。一旦有事件发生,监听器就会立刻通知程序去执行相应的代码。

简单来说,事件和监听器的组合就像是一个互动的游戏,用户的每一次操作都会引发程序的反应。这种机制让我们的应用程序变得更加生动和有趣。

希望这个解释能帮助你更好地理解事件和监听器的概念!

>>> {i:i for i in range(1, 11)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}
170

你可以使用 dict.fromkeys 这个方法来创建字典...

>>> dict.fromkeys(range(5), True)
{0: True, 1: True, 2: True, 3: True, 4: True}

这是创建一个字典的最快方法,所有的键都指向同一个值。

但是 千万要注意,不要用这个方法来处理可变对象

d = dict.fromkeys(range(5), [])
# {0: [], 1: [], 2: [], 3: [], 4: []}
d[1].append(2)
# {0: [2], 1: [2], 2: [2], 3: [2], 4: [2]} !!!

如果你其实并不需要初始化所有的键,使用 defaultdict 可能会更有用:

from collections import defaultdict
d = defaultdict(True)

关于第二部分,字典推导式正是你需要的:

{k: k for k in range(10)}

虽然你可能不应该这样做,但你也可以创建一个 dict 的子类,如果你重写 __missing__ 方法,它的工作方式有点像 defaultdict

>>> class KeyDict(dict):
...    def __missing__(self, key):
...       #self[key] = key  # Maybe add this also?
...       return key
... 
>>> d = KeyDict()
>>> d[1]
1
>>> d[2]
2
>>> d[3]
3
>>> print(d)
{}
684

在Python 2.7及以上版本中,有一种叫做字典推导式的东西,但它的工作方式和你想的不太一样。就像列表推导式一样,它们会创建一个新的字典;你不能用它们来给已经存在的字典添加键。此外,你必须指定键和值,当然如果你愿意,也可以指定一个虚拟值。

>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

如果你想把它们都设置为True:

>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}

你似乎是在问有没有办法一次性给一个已有的字典设置多个键。其实没有直接的快捷方式。你可以像你之前展示的那样使用循环,或者你可以用字典推导式创建一个新的字典,然后用oldDict.update(newDict)把新值合并到旧字典里。

撰写回答