【发布时间】:2018-08-20 22:46:59
【问题描述】:
这是我的代码:
a = {}
ins = ["foo", "bar"]
for i in ins:
a[i] = {}
输出
{'foo': {}, 'bar': {}}
基本上,我想为列表中的每个项目创建一个字典。 有什么方法可以使用 map 或 lambda 以更简洁的方式做到这一点?
【问题讨论】:
标签: python python-3.x dictionary lambda
这是我的代码:
a = {}
ins = ["foo", "bar"]
for i in ins:
a[i] = {}
输出
{'foo': {}, 'bar': {}}
基本上,我想为列表中的每个项目创建一个字典。 有什么方法可以使用 map 或 lambda 以更简洁的方式做到这一点?
【问题讨论】:
标签: python python-3.x dictionary lambda
正确的做法不是基于map或lambda,而是简单的dict comprehension:
ins = ["foo", "bar"]
a = {x: {} for x in ins}
您可以像这样使用map 和lambda 来做到这一点:
a = dict(map(lambda x: (x, {}), ins))
但这比直接的dict 理解更慢且更冗长。
如果您的关联值是不可变的,那么 the dict.fromkeys alternate constructor 将是一个很好的解决方案,但它每次都会重用默认值,因此如果您将其与默认值 {} 一起使用,它将使所有键都引用相同 dict,通过一键修改它会改变所有其他:
a = dict.fromkeys(ins, 0) # GOOD! int is immutable
a = dict.fromkeys(ins, {}) # BAD! dict is mutable
最后,在许多此类情况下,一个不错的选择是use collections.defaultdict 在您访问(以前)不存在的密钥时提供默认值。这样,您就可以这样做:
from collections import defaultdict
a = defaultdict(dict)
通过括号语法访问任何键(来自ins 或不来自ins)将在首次访问时为其分配一个值dict()(相当于{})。
【讨论】: