具有空列表值的字典
Dictionary with values of empty list
我想创建一个键为 1、2、3、4 的字典
键的每个值都是 [].
n = [1,2,3,4]
d = dict.fromkeys(n, [])
d[1].append(777)
print(d)
--> {1: [777], 2: [777], 3: [777], 4: [777]}
为什么会这样?为什么这不是 {1: [777], 2: [], 3: [], 4: []}
?
您在第二步中用作值的列表都指向同一内存。因此,当您更新其中一个值时,所有值都会更新。
您可以使用以下命令检查 -
n = [1,2,3,4]
d = dict.fromkeys(n, [])
d[1] is d[2] #share memory
#True
因此,您可以通过一种方式执行以下操作 -
n = [1,2,3,4]
d = {k:[] for k in n}
d[1] is d[2]
#False
然后就可以设置了-
d[1].append(777)
{1: [777], 2: [], 3: [], 4: []}
更好的方法是使用 collections.defaultdict
。这允许您使用 defaultdict(list)
创建一个默认值是 list
个对象的字典。它具有可扩展性,因为您可以选择需要字典值的数据类型。
from collections import defaultdict
n = [1,2,3,4]
d = defaultdict(list)
d[1].append(777)
我想创建一个键为 1、2、3、4 的字典 键的每个值都是 [].
n = [1,2,3,4]
d = dict.fromkeys(n, [])
d[1].append(777)
print(d)
--> {1: [777], 2: [777], 3: [777], 4: [777]}
为什么会这样?为什么这不是 {1: [777], 2: [], 3: [], 4: []}
?
您在第二步中用作值的列表都指向同一内存。因此,当您更新其中一个值时,所有值都会更新。
您可以使用以下命令检查 -
n = [1,2,3,4]
d = dict.fromkeys(n, [])
d[1] is d[2] #share memory
#True
因此,您可以通过一种方式执行以下操作 -
n = [1,2,3,4]
d = {k:[] for k in n}
d[1] is d[2]
#False
然后就可以设置了-
d[1].append(777)
{1: [777], 2: [], 3: [], 4: []}
更好的方法是使用 collections.defaultdict
。这允许您使用 defaultdict(list)
创建一个默认值是 list
个对象的字典。它具有可扩展性,因为您可以选择需要字典值的数据类型。
from collections import defaultdict
n = [1,2,3,4]
d = defaultdict(list)
d[1].append(777)