📜  Python字典dictionary | fromkeys()方法

📅  最后修改于: 2020-07-22 04:32:16             🧑  作者: Mango

有时需要根据给定的键生成字典。蛮力地执行它会花费时间,并且会变得更加乏味。因此,fromkeys()可以帮助我们轻松地并且仅使用一种方法即可完成此任务。本文介绍了与此功能相关的工作和其他方面。

语法: fromkeys(seq, val)


参数:
seq:要转换为字典的序列。
val:需要分配给生成的键的初始值。默认为无。

返回:如果没有提供值,则字典的键映射为None,否则为字段中提供的值。

代码1:演示fromkeys()的工作方式

# Python 3代码演示fromkeys()的工作方式
  
# 初始化序列  
seq = { 'a', 'b', 'c', 'd', 'e' } 
  
# 使用fromkeys()将序列转换为字典,使用无初始化 
res_dict = dict.fromkeys(seq) 
  
# 打印创建字典 
print ("新创建的无值字典 : " + str(res_dict)) 
  
  
# 使用fromkeys()将序列转换为字典以1初始化
res_dict2 = dict.fromkeys(seq, 1) 
  
# 打印创建字典 
print ("新创建的字典,其值为1 : " + str(res_dict2))

输出:

新创建的无值字典 : {‘d’: None, ‘a’: None, ‘b’: None, ‘c’: None, ‘e’: None}
新创建的字典,其值为1 : {‘d’: 1, ‘a’: 1, ‘b’: 1, ‘c’: 1, ‘e’: 1}

fromdict()的行为,以Mutable对象作为值:

fromdict()也可以提供可可变对象作为默认值。但是在这种情况下,将由字典构成一个深层副本,即,如果我们在原始列表中附加值,则附加会发生在键的所有值中。

预防措施:某些字典理解技术可用于创建新列表作为键值,而不将原始列表指向键值。

 

代码2:演示可变对象的行为。

# Python 3代码演示可变对象的行为 
  
# 初始化顺序和清单 
seq = { 'a', 'b', 'c', 'd', 'e' } 
lis1 = [ 2, 3 ] 
  
# 使用fromkeys()使用常规方法将序列转换为dict 
res_dict = dict.fromkeys(seq, lis1) 
  
# 打印创建字典 
print ("新创建的具有列表值的字典 : "
                                    + str(res_dict)) 
  
# 附加到lis1 
lis1.append(4) 
  
# 追加后打印字典。注意,append发生在所有值中 
print ("追加后具有列表值的字典 : "
                                    + str(res_dict)) 
  
lis1 = [ 2, 3 ] 
print ('\n') 
  
# 使用fromkeys()使用dict将序列转换为dict 
res_dict2 = { key : list(lis1) for key in seq } 
  
# 打印创建字典 
print ("新创建的具有列表值的字典 : " 
                                  + str(res_dict2)) 
  
# 附加到lis1 
lis1.append(4) 
  
# 追加后打印dict注意现在不进行追加. 
print ("追加后具有列表值的字典 (no change) : "
                                               + str(res_dict2)) 

输出:

新创建的具有列表值的字典 : {‘d’: [2, 3], ‘e’: [2, 3], ‘c’: [2, 3], ‘a’: [2, 3], ‘b’: [2, 3]}
追加后具有列表值的字典 : {‘d’: [2, 3, 4], ‘e’: [2, 3, 4], ‘c’: [2, 3, 4], ‘a’: [2, 3, 4], ‘b’: [2, 3, 4]}

新创建的具有列表值的字典 : {‘d’: [2, 3], ‘e’: [2, 3], ‘c’: [2, 3], ‘a’: [2, 3], ‘b’: [2, 3]}
追加后具有列表值的字典 (no change) : {‘d’: [2, 3], ‘e’: [2, 3], ‘c’: [2, 3], ‘a’: [2, 3], ‘b’: [2, 3]}