python - 如何使用列表中的键和Python中的空值初始化dict?
Posted
技术标签:
【中文标题】python - 如何使用列表中的键和Python中的空值初始化dict?【英文标题】:How to initialize a dict with keys from a list and empty value in Python? 【发布时间】:2011-01-15 13:27:32 【问题描述】:我想从中得到:
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
【问题讨论】:
【参考方案1】:dict.fromkeys([1, 2, 3, 4])
这实际上是一个类方法,所以它也适用于字典子类(如collections.defaultdict
)。可选的第二个参数指定用于键的值(默认为 None
。)
【讨论】:
小心初始化可变的东西:如果你调用,例如,dict.fromkeys([1, 2, 3], [])
,所有的键都映射到同一个列表,修改一个会修改它们。
使用k:[] for k in [1, 2, 3]
初始化仍然是安全的。【参考方案2】:
没人愿意提供听写理解的解决方案吗?
>>> 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
【讨论】:
我相信它已被向后移植到 2.7 这很好,并且不会像接受的答案那样受到参考问题的影响。 这也允许你指定一个默认值(例如False
)。
这是 Python3 IMO 中最干净、最 Pythonic 的方式
使用 dict-comp 还允许将值作为调用函数的结果(如果需要,可以将键作为参数传递)——这是一种非常强大的机制。【参考方案3】:
dict.fromkeys(keys, None)
【讨论】:
太棒了,我想要空列表,dict.fromkeys(keys, [])
@muon 这几乎肯定不是你想要的,请参阅charleslparker comment。
适用于 Python 2.6.6 版。
注意:这将初始化dict,所有键都指向相同的单个值【参考方案4】:
>>> keyDict = "a","b","c","d"
>>> dict([(key, []) for key in keyDict])
输出:
'a': [], 'c': [], 'b': [], 'd': []
【讨论】:
虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。 名称keyDict
具有误导性,因为第一行代码返回set
,而不是dict
。
它们可能会被映射到同一个列表中【参考方案5】:
d =
for i in keys:
d[i] = None
【讨论】:
为什么 Python 会抛出如下错误:TypeError: 'type' object is not iterable
?
@FrancescoCastellani 因为list
是一种类型。除非你有list = []
之类的东西,否则上面的方法总是会给你同样的错误【参考方案6】:
在许多工作流程中,您希望为任意键附加默认/初始值,您不需要提前单独对每个键进行哈希处理。您可以使用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])
【讨论】:
以上是关于python - 如何使用列表中的键和Python中的空值初始化dict?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中的键和值列表上使用 Lambda 函数获取最大值和最小值?