在python3.6中,如何用一系列键和值作为空集初始化字典?

在python3.6中,如何用一系列键和值作为空集初始化字典?,python,python-3.x,Python,Python 3.x,我尝试使用dict.fromkeys([1,2,3],set())。这会初始化创建字典,但当我向任何一个集合添加值时,所有集合都会更新 >>> d=dict.fromkeys([1,2,3],set()) >>> d >>> {1: set(), 2: set(), 3: set()} >>> d[1].add('a') >>> d >>> {1: {'a'}, 2: {'a'}, 3:

我尝试使用dict.fromkeys([1,2,3],set())。这会初始化创建字典,但当我向任何一个集合添加值时,所有集合都会更新

>>> d=dict.fromkeys([1,2,3],set())
>>> d
>>> {1: set(), 2: set(), 3: set()}
>>> d[1].add('a')
>>> d
>>> {1: {'a'}, 2: {'a'}, 3: {'a'}}

字典中的三个值似乎都指向同一个集合。我想将字典中的所有值初始化为空集,以便以后可以基于键在循环中对这些集执行一些操作

使用字典理解

d = {x: set() for x in [1, 2, 3]}
或者使用

您可以使用

>>从集合导入defaultdict
>>>d=默认DICT(设置)
>>>d[1]。添加('a')
>>>d
defaultdict(,{1:{'a'}})
>>>d[2]。添加('b')
>>>d
defaultdict(,{1:{'a'},2:{'b'})
它的工作方式是,当您尝试向键添加值时,如
dict[key].add(value)
,它会检查键是否存在;如果是,则将该值添加到集合中。如果不存在该值,则将该值添加为
,因为默认值设置为
defaultdict(set)
)。

您需要一个,因此首先不需要初始化集

>>> from collections import defaultdict
>>> d = defaultdict(set)
# That's it, initialization complete. Use goes like this:
>>> d[1].add('a')
>>> d[2].add('b')
>>> d[3].add('c')
>>> d
defaultdict(<class 'set'>, {1: {'a'}, 2: {'b'}, 3: {'c'}})
>>从集合导入defaultdict
>>>d=默认DICT(设置)
#就这样,初始化完成了。用法如下:
>>>d[1]。添加('a')
>>>d[2]。添加('b')
>>>d[3]。添加('c')
>>>d
defaultdict(,{1:{'a'},2:{'b'},3:{'c'})

另请参见
defaultdict
-您可以创建一个dict,该dict将自动为您的每个新密钥创建一个空集。Great的可能副本!这很有效。但是我认为
fromkeys()
应该做同样的事情。你能解释一下
fromkeys()
的情况吗
set()
只在
fromkeys()调用中调用一次。DC每次都调用它。然后我看不出
fromkeys()
函数的意义,除了在初始化值是原子类型(如数字或无)的情况下使用它。@Dhruv,如果您想拥有可变值,通常使用
defaultdict
,这样可以省去初始化的麻烦;如果初始化本身很重要或依赖于键,则使用dict理解。
>>> from collections import defaultdict
>>> d = defaultdict(set)
# That's it, initialization complete. Use goes like this:
>>> d[1].add('a')
>>> d[2].add('b')
>>> d[3].add('c')
>>> d
defaultdict(<class 'set'>, {1: {'a'}, 2: {'b'}, 3: {'c'}})