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
不过,我得到一个SyntaxError
上for
。
另外(我不需要这个部分,但只是想知道),你能设置一个字典的键到一堆不同的值,像这样:
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