我正在初始化一个像这样的序列
seq = {'a', 'b', 'c', 'd', 'e'}
现在我使用fromkeys()将序列转换为集合字典。下面是我正在做的:
val = set()
seq_dict = dict.fromkeys(seq, val)
现在看来,如果只向我的一个字典键集添加一个元素,那么该元素将被添加到所有其他集合。下面是示例:
seq_dict['a'].add("val1")
print(seq_dict)
{'d': {'val1'}, 'c': {'val1'}, 'b': {'val1'}, 'a': {'val1'}, 'e': {'val1'}}
不确定我是否以正确的方式使用fromkeys ?
fromkeys
方法按预期工作,因为您有正确的结果:一个字典,其中键是seq
变量中的字符,并且每个值都是空集。
您的问题是由于您分配的值的可变性:您为所有关键字分配了一个空集作为值。如果您更改此(seq_dict['a'].add("val1")
),则所有关键字的值都被更改(每个关键字引用原始空集)。
您可能需要使用字典推导式(它为每个键创建一个新的空集的不同副本)来避免此问题:
seq = {'a', 'b', 'c', 'd', 'e'}
seq_dict = {key: set() for key in seq}
val = set()
seq_dict = dict.fromkeys(seq, val)
您正在用相同的set
初始化seq_dict
(amutable
)type
),所以编辑seq_dict['a']
你编辑的是同一个set
,它是所有其他键的值。
如果您不希望发生这种情况,则必须以其他方式初始化dict
序列。
>>> d = {i: set() for i in ('a', 'b', 'c', 'd', 'e')}
>>> d
{'a': set(), 'b': set(), 'c': set(), 'd': set(), 'e': set()}
>>> d['a']
set()
>>> d['a'].add('ehi')
>>> d
{'a': {'ehi'}, 'b': set(), 'c': set(), 'd': set(), 'e': set()}
所以,换句话说,你必须"隔离">**immutable
**的set
:
seq = {'a', 'b', 'c', 'd', 'e'}
seq_dict = {key: set() for key in seq}