Python 字典推导式
在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 个回答
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,我们希望程序能做出反应。这种情况通常会用到“事件”这个概念。
事件就像是一个信号,告诉程序某件事情发生了。比如,用户点击鼠标、按下键盘,或者页面加载完成,这些都是事件。当这些事件发生时,程序会根据预先设定的规则来执行相应的操作。
为了让程序能够处理这些事件,我们通常会写一些“监听器”。监听器就像是一个守卫,时刻关注着事件的发生。一旦有事件发生,监听器就会立刻通知程序去执行相应的代码。
简单来说,事件和监听器的组合就像是一个互动的游戏,用户的每一次操作都会引发程序的反应。这种机制让我们的应用程序变得更加生动和有趣。
希望这个解释能帮助你更好地理解事件和监听器的概念!
>>> {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}
你可以使用 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)
{}
在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)
把新值合并到旧字典里。