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

不过,我得到一个SyntaxErrorfor

另外(我不需要这个部分,但只是想知道),你能设置一个字典的键到一堆不同的值,像这样:

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


在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)将新值合并到旧字典中。


你可以使用dict.fromkeys类的方法...

>>> dict.fromkeys(range(1, 11), True)
{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}

这是创建字典的最快方式,所有键映射到相同的值。

尽管如此,请谨慎使用这个可变对象:

d = dict.fromkeys(range(10), [])
d[1].append(2)
print(d[2])  # ???

如果你实际上并不需要初始化所有的键,那么defaultdict也可能是有用的:

from collections import defaultdict
d = defaultdict(lambda: True)

为了回答第二部分,你需要一个字典理解:

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

或者对于python2.6:

dict((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}
链接地址: http://www.djcxy.com/p/30427.html

上一篇: Python Dictionary Comprehension

下一篇: Best way to store command line arguments in C