在这篇文章中,我们将学习python中的数据结构Nested dictionary。同时,我们还将学习如何创建、访问、修改和迭代它们。
目录:
- 什么是字典?
- 什么是嵌套字典?
- 创建嵌套字典的不同方法
- 访问嵌套字典中的元素
- 添加嵌套字典项目
- 更新嵌套字典的项目
- 合并两个嵌套字典
- 删除嵌套字典项目
- 遍历嵌套字典
字典
Dictionary是无序的、可变的Python数据结构,它存储唯一键到值的映射。
它也可以被视为hashmaps ,在C++ ,或者json ,在JavaScript 。
注意:Dictionary 的 key 是区分大小写的:
dict1 ={'key1':'value1','key2':'value2','key3':'value3','key4':'value4'}
在这里,我们声明了一个名为dict1 的字典,它以大括号({})开始,包括所有的键值对,用(,)和冒号(:)隔开每个键和它的值。(key1, key2, key3, key4) 是各自的唯一键,(value1, value2, value3, value4) 是各自分配给键的值。
嵌套字典
嵌套字典基本上意味着把一个字典放在另一个字典里面:
nested_dict = {'id1':'Fred','id2':'Hughes','dict2':{'id3':'Philips','id4':'Jock'}}
在这里,我们看到我们有常规的键值对,包括一个字典dict2 ,它有2个键值对,描述nested_dict 作为嵌套字典。
在 Python 中创建嵌套字典的不同方法
有两种创建嵌套字典的方法。
- 就像普通的字典一样,我们可以创建嵌套字典,唯一的区别是每个值可以是一个字典,也可以是一个单一的
key-value对:
dictA = {'student1':{'address1':'Las Vegas'},
'student2':{'address2':'Delhi'},
'student3':{'address3':'Texas'},
'student4':{'address4': 'Mumbai'}}
- 另外,我们可以通过构造函数
dict()来构造嵌套字典。为此,我们需要在关键字参数dict()中传递键值对:
dictB = dict(Person1':{'House_number':01,'Colony':'Grape street'},
'Person2':{'House_number':033,'Colony':'Freds street'},
'Person3':{'House_number':21,'Colony':'Driver street'})
我们也可以使用fromkeys() 方法为每个键创建带有默认值的 dictionary。
CustID = ['cust1','cust2','cust3','cust4']
Default = {'name': '', 'Shops_visited': }
Customer = dict.fromkeys(CustID, Default)
print(Customer)
# Prints {'cust1': {'name': '', 'Shops_visited': ''},
# 'cust2': {'name': '', 'Shops_visited': ''},
# 'cust3': {'name': '', 'Shops_visited': ''},
# 'cust4': {'name': '', 'Shops_visited': ''} }
访问嵌套的 dictionary 中的元素
可以用square brackets([]) 来访问各个键、值:
dictB = {'Person1':{'House_number':1,'Colony':'Grape street'},
'Person2':{'House_number':33,'Colony':'Freds street'},
'Person3':{'House_number':21,'Colony':'Driver street'}}
在这个字典中,如果我们想得到Person2 的House_number ,我们将使用 print 语句:
print(dictB['Person2']['House_number'])
# output is 33
如果有一个对键的引用不存在于嵌套字典中,那么它就会产生一个异常:
print(dictB['Person1']['city'])
这个语句的输出将是一个keyerror的异常,它将是不存在于dictB 的key,名为city.precisely:
#keyerror: 'city'
为了防止这种情况发生,我们可以使用特殊的字典方法 get()。
如果字典中存在相应的键,get() ,否则它返回None ,这意味着这个方法永远不会引发keyerror 。
在 Python 中向嵌套的字典添加项目
如果我们想把新的项、值或键添加到 dictionary 中,我们可以添加与之相关的 Dictionary:
dictA = {'student1':{'address1':'Las Vegas'},
'student2':{'address2':'Delhi'},
'student3':{'address3':'Texas'}}
假设在dictA 中,我们将添加一个 student3,我们的做法是。
dictA['student4'] = {'address4':'Tokyo'}
这就在嵌套的 dictionary 中添加了新的 dictionary。现在,dictA 看起来是这样的:
dictA = {'student1':{'address':'Las Vegas'},
'student2':{'address':'Delhi'},
'student3':{'address':'Texas'},
'student4':{'address':'Mumbai'}}
另外,我们可以说dictA 已经被更新了,因为我们在其中添加了一个项目。
假设我们想改变嵌套字典中的某个键或值或项目,我们通过它的键和相应的值来参考这个项目,并把它改成我们想要的样子。
dictA = {'student1':{'address':'Las Vegas'},
'student2':{'address':'Delhi'},
'student3':{'address':'Texas'},
'student4':{'address':'Mumbai'}}
更新存储在嵌套字典中的项目
假设student3将他的地址从Texas改为Paris.这里,我们可以这样做。
dictA['student3']:{'address':'Paris'}
print(dictA)
#prints {'student1':{'address':'Las Vegas'},
'student2':{'address':'Delhi'},
'student3':{'address':'Paris'},
'student4':{'address':'Mumbai'}}
现在student3 的数据已被更新为新的地址Paris 。
在Python中合并两个嵌套字典
-
python内置的
update()方法可以用来合并两个嵌套字典(它的方法是将字典的键和值合并到一起)。 -
这里需要注意的是,
update()将会覆盖那些相同的键值,因此,相互之间的冲突也会被覆盖。
dictV = {'employee1':{'name':'Andrew','job':'System engineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3'{'name':'Steph','job':'salesperson','address':'banglore'} }
dictM = { 'employee3'{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
dictV.update(dictM)
print(dictV)
#printed data:
{'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3'{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
- 注意,
employee3中一个被加倍的键已被删除,我们在嵌套字典中只有4个字典,这说明dictM中一个重复的字典已被删除。
在 Python 中删除嵌套字典的项目
有多种方法来删除嵌套字典中的项目,其中一些方法是使用pop() 方法等:
- 通过使用键,我们可以使用
pop()方法删除该键和它各自的值:
dictV = {'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3'{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
popped_item = dictV.pop('employee1')
print(dictV)
print(popped_item)
#Prints:
# {'employee2':{'name':'John','job':'AIscientist','address':'hyderabad'},
# 'employee3'{'name':'Steph','job':'salesperson','address':'banglore'},
# 'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
#popped_item: {'employee1':'name':'Andrew','job':'Systemengineer','address':'Delhi'}
- 假设我们不需要这个弹出的值,我们可以用
del方法来删除它:
dictV = {'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3'{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
del.dictV['employee1']
print(dictV)
#prints:
{'employee2':{'name':'John','job':'AIscientist','address':'hyderabad'},
'employee3':{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4':{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
- 如果我们想弹出嵌套字典中的最后一个项目,我们可以使用
popitem()来完成:
dictV = {'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3':{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4':{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
poped_last = dictV.popitem()
在这里,我们现在将打印dictV 和poped_item 的输出。我们希望输出的是dictV ,不包括employee4 的键(它的相应值也将被删除),而poped_last 将是被弹出的最后一个项目的键employee4 。
输出
print(dictV)
print(poped_last)
#prints:
{'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3'{'name':'Steph','job':'salesperson','address':'banglore'}}
{'employee4'{'name':'Nicolas','job':'Project Manager','address':'Mohali'}
在python中遍历嵌套字典
嵌套字典中的所有值都可以在for loop 的帮助下进行迭代,其中大部分是嵌套的:
dictV = {'employee1':{'name':'Andrew','job':'Systemengineer','address':'Delhi'},
'employee2':{'name':'John','job':'AI scientist','address':'hyderabad'},
'employee3':{'name':'Steph','job':'salesperson','address':'banglore'},
'employee4':{'name':'Nicolas','job':'Project Manager','address':'Mohali'}}
for id in dictV:
print('Employee ID-',id)
for key in dictV[id]:
print(key +':', dictV[id][key])
在这里,我们通过循环寻找id,告诉我们雇员的id。然后,当我们第二个for循环时,我们将打印出
与该键
相对应的值
,因此给我们所需的打印语句。
这是上述代码的输出:
#output
'''
Employee ID- employee1
name: Andrew
job: Systemengineer
address: Delhi
Employee ID- employee2
name: John
job: AI scientist
address: hyderabad
Employee ID- employee3
name: Steph
job: salesperson
address: banglore
Employee ID- employee4
name: Nicolas
job: Project Manager
address: Mohali
'''
通过OpenGenus的这篇文章,你一定对Python中的嵌套字典有了完整的了解。