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

Jua*_*nti 222 python dictionary

我想从中得到:

keys = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

对此:

{1: None, 2: None, 3: None}
Run Code Online (Sandbox Code Playgroud)

这是一种pythonic方式吗?

这是一种丑陋的方式:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}
Run Code Online (Sandbox Code Playgroud)

Tho*_*ers 350

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

这实际上是一个classmethod,所以它也适用于dict-subclasses(like collections.defaultdict).可选的第二个参数指定用于键的值(默认为None.)

  • 小心初始化为可变的东西:如果你调用,例如``dict.fromkeys([1,2,3],[])`,所有键都被映射到同一个列表,修改一个键会将它们全部修改. (139认同)
  • 用[{,2,3]}中的k用{{k:[]初始化”仍然是安全的。 (2认同)

Adr*_*son 240

没有人愿意提供一个字典理解解决方案?

>>> 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}
Run Code Online (Sandbox Code Playgroud)

  • 我相信这是向后移植到2.7 (31认同)
  • 这很好,不会受到接受的答案所引用的参考问题的影响. (19认同)
  • 使用dict-comp还允许该值是调用函数的结果(如果需要,可以将键作为参数传递) - 这是一个非常强大的机制. (4认同)
  • 这是 Python3 IMO 中最干净、最 Pythonic 的方式 (2认同)

Dom*_*ney 55

dict.fromkeys(keys, None)
Run Code Online (Sandbox Code Playgroud)

  • @muon这几乎肯定不是你想要的,请参阅[charleslparker评论](http://stackoverflow.com/questions/2241891/how-to-initialize-a-dict-with-keys-from-a-list-and -empty值合蟒#comment25131847_2241904). (10认同)
  • 太棒了,我想要空列表,``dict.fromkeys(keys, [])`` (5认同)
  • 注意:这将初始化 dict,所有键都指向相同的单个值 (4认同)

May*_*hti 12

>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])
Run Code Online (Sandbox Code Playgroud)

输出:

{'a': [], 'c': [], 'b': [], 'd': []}
Run Code Online (Sandbox Code Playgroud)

  • 名称`keyDict`具有误导性,因为第一行代码返回`set`,而不是`dict`. (4认同)
  • 虽然此代码可能会回答问题,但提供有关_how_ 和/或 _why_ 解决问题的附加上下文将提高​​答案的长期价值。 (3认同)

jpp*_*jpp 8

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

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None
Run Code Online (Sandbox Code Playgroud)

这更有效,它无需在实例化时散列所有密钥。此外,defaultdict是 的子类dict,因此通常不需要转换回常规字典。

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

d = dict.fromkeys([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)


ins*_*get 7

d = {}
for i in keys:
    d[i] = None
Run Code Online (Sandbox Code Playgroud)

  • 为什么 Python 会抛出这样的错误:`TypeError: 'type' object is not iterable`? (2认同)
  • @FrancescoCastellani 因为`list` 是一种类型。除非你有类似`list = []`的东西,上面的方法总是会给你同样的错误 (2认同)