如何在Python中使用列表中的键和空值初始化字典?


251

我想从中得到:

keys = [1,2,3]

对此:

{1: None, 2: None, 3: None}

有pythonic的方法吗?

这是一个丑陋的方法:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

Answers:


388

dict.fromkeys([1, 2, 3, 4])

这实际上是一个类方法,因此它也适用于dict子类(如collections.defaultdict)。可选的第二个参数指定用于键的值(默认为)None


153
初始化可变的对象时要小心:如果您调用,例如,则dict.fromkeys([1, 2, 3], [])所有键都映射到同一列表,修改一个键将全部修改。
charleslparker 2013年

8
初始化{k:[] for k in [1, 2, 3]}仍然是安全的。
阿齐兹·阿尔托

262

没有人愿意提供字典理解的解决方案吗?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
我相信它会
回迁

21
这很好,不会受到公认的答案所带来的参考问题的困扰。
charleslparker 2013年

这还允许您分配默认值(例如False)。
neverendingqs 2015年

这是Python3 IMO中最干净,最Python的方式-Bede
Constantinides

4
使用dict-comp还可以使值成为调用函数的结果(如果需要,可以将键作为参数传递给它)-这是一种非常强大的机制。
martineau



10
d = {}
for i in keys:
    d[i] = None

1
为什么Python中抛出了一个错误,如:TypeError: 'type' object is not iterable
FaCoffee,2015年

1
@FrancescoCastellani因为list是一种类型。除非您有类似的东西list = [],否则上面的方法将始终给您相同的错误
smac89 2015年

1

许多地方要附加任意键默认/初始值的工作流程,你没有需要到哈希每个键单独的时间提前。您可以使用collections.defaultdict。例如:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

这样效率更高,它省去了在实例化时散列所有键的麻烦。此外,defaultdict是的子类dict,因此通常无需转换回常规字典。

对于需要对许可键进行控制的工作流,可以dict.fromkeys按照已接受的答案使用:

d = dict.fromkeys([1, 2, 3, 4])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.