Python字典理解

2024-04-26 11:47:22 发布

您现在位置: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


Tags: intrue列表for字典valuerangesame
3条回答

您可以使用^{}类方法。。。

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

这是创建字典的最快方法,其中所有键都映射到同一个值。

但是do not use this with mutable objects

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)
{}
>>> {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}

dictionary comprehensions in Python 2.7+,但它们的工作方式与您尝试的不同。像列表理解一样,它们创建一个新的字典;您不能使用它们向现有字典添加键。此外,还必须指定键和值,当然,如果愿意,也可以指定一个伪值。

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

如果要将它们全部设置为真:

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

你想要的似乎是一种在现有字典上同时设置多个键的方法。没有直接的捷径。您可以像已经显示的那样循环,也可以使用字典理解创建一个带有新值的新dict,然后执行oldDict.update(newDict)将新值合并到旧dict中

相关问题 更多 >