python中的数据结构Nested dictionary

887 阅读6分钟

在这篇文章中,我们将学习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 中创建嵌套字典的不同方法

两种创建嵌套字典的方法

  1. 就像普通的字典一样,我们可以创建嵌套字典,唯一的区别是每个值可以是一个字典,也可以是一个单一的key-value 对:
dictA = {'student1':{'address1':'Las Vegas'},
         'student2':{'address2':'Delhi'},
         'student3':{'address3':'Texas'},
         'student4':{'address4': 'Mumbai'}}
  1. 另外,我们可以通过构造函数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'}}

在这个字典中,如果我们想得到Person2House_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()

在这里,我们现在将打印dictVpoped_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中的嵌套字典有了完整的了解。