当前位置:   article > 正文

Python的字典/字典多层(2层/3层)嵌套操作_python字典嵌套字典

python字典嵌套字典

字典(Dictionary)用“{}”标识,有索引(key)和它对应的值(value)组成,是除列表(list)以外,Python中最灵活的内置数据结构类型,以k-v数据类型行程键-值对。

其他关于字典操作的,可以参考这里:Python数据系列(二)- 字典Dict:Python的“大胃王”,实在好用icon-default.png?t=N7T8https://qianlingjun.blog.csdn.net/article/details/103496282

  • 列表是有序的(位置)对象组合,可通过 list[int] ,找到 index=int 对应的值;
  • 而字典是无序的对象组合,元素通过 key 关键字来存取对应的值 value。

可存储任意类型的对象,如字符串、数字、元组等其他容器模型。

我们在日常的数据处理中,遇到数据字典的情况大多数是数据存在层级结构的时候,包含关系,或者从属关系。在操作中就要分为两种情况:

  1. 使用(解析)字典:操作是从外层字典,逐步的进去内层字典
  2. 创建(保存)字典:先构建内层字典,再外层字典包含内层字典

字典的使用,使得数据的处理方便了很多,尤其是针对无序的数组,先保存为字典,在最后对无序的整理为有序的,再统一处理,从整理上把握大局。

与此同时,对于算法与后端之间的交互,一般也都是采用字典的格式进行传递的,以json文件的存储结果最为常见。所以,学好字典,事半功倍。

尤其是在你有一堆各色各异的属性,和对应的值需要存储的时候,字典的作用就非常的明显了,比如下面这种情况:(记录学生信息的字典)

  1. students_info = {
  2. 'lily':{
  3. 'height':175,
  4. 'weight':50,
  5. 'father': gao hanyu,
  6. 'mother': guo meili,
  7. 'english score':102,
  8. },
  9. 'shasha':{
  10. 'height':170,
  11. 'weight':40,
  12. 'father': guo li,
  13. 'mother': da meili,
  14. 'english score':98,
  15. }
  16. }

 这里面就会涉及一个问题,就是再创建和不断的添加信息阶段,需要不断的更新这个字典。下面给出了一个方法,当然肯定还有其他的方式,但遵从的一个原则如下:

  1. 先取出字典中原来对应位置的值,或者是整个字典,作为临时变量;
  2. 对临时变量进行修改,把需要补充,或者删除的部分给操作了;
  3. 再将改好的临时变量,赋值给原字典,这样就完成了一次字典的更新。

这种思路不仅仅适用于字典内元素的更改,对于列表等等内元素的更改,依旧适用。

一、采用2层嵌套字典dict的项目实操

一层字典格式是比较常见的,也是字典使用的一个基本形式,形式如下:

  1. dict_tmp={'key1':value1,
  2. 'key2':value2,
  3. 'key3':value3,}

那假如,我们的数据层级比较的复杂,班级下面有年级,年级下面还有几十个学生,学生下面还有姓名和性别,那这个时候就可以使用多层嵌套的形式,存储数据了,案例如下:

  1. dict_tmp={'key1':{'class1': 1
  2. 'class2':2
  3. },
  4. 'key2':{'class3': 3
  5. 'class4':4
  6. },
  7. 'key3':{'class5': 5
  8. 'class6':6
  9. },
  10. }

我第一次想要储存一系列的信息的时候,比如姓名、年龄、身高、体重等等信息。当时还不知道使用字典,愚蠢的使用了字符串,比如:姓名#年龄#身高#体重,的方式,搞了一大串。尽管最后也达到了这个目的,但是很臃肿,不是很好记录。

下面就以一个真实的案例,来实操下。看文件,其中以“_”进行分割的第一个字符是名字,又发现有些文件中又存在名字和日期的组合形式。

这里就是要把某一个人,无论有没有日期,都做统一的处理,究竟该如何处理,这个需要自己在项目中而异了。

这里直接实操代码,内有注释,应该能看懂

  1. from xpinyin import Pinyin
  2. from itertools import groupby
  3. def rename_docum():
  4. raw_path="F:\\data"
  5. p=Pinyin()
  6. dict_information_one_patient = {} # 最外层的字典-------------------------重点
  7. for (path, dirs, files) in os.walk(raw_path):
  8. for filename in files:
  9. name=filename.split("_")[0]
  10. print(name)
  11. dict_inform_image = {} # 内层字典,与外层字典行成嵌套字典形式-------重点
  12. ss = [''.join(list(g)) for k, g in groupby(name, key=lambda x: x.isdigit())]
  13. if ss[0].lower() in list_name: # 由于name中提取的字符是大写,list_name的元素都是小写,所以先转化一致
  14. try:
  15. name_index=list_name.index(ss[0].lower())
  16. last_test_time = ss[1] # ss[0]是名称,ss[1]是时间
  17. print(name_index)
  18. print(last_test_time)
  19. print(list_time[name_index])
  20. # 这里就是先确定ss[0]在list_name中的index,然后在list_time
  21. # 中找到与之相对应位置的时间,传给内层字典
  22. # 创建内层字典啦-------------------------重点
  23. dict_inform_image[name] = list_time[name_index]
  24. """
  25. 字典形式保存all patient信息,
  26. 判断ss[0]是否是dict_information_one_patient的key
  27. 如果不在,则将dict_inform_image作为value,ss[0]作为key加入字典内
  28. 若是已经存在了,则把存在信息先拿出来,在与新的信息进行合并,最后替换旧的信息-------------------------重点
  29. """
  30. if ss[0] not in dict_information_one_patient:
  31. dict_information_one_patient[ss[0]] = dict_inform_image
  32. else:
  33. x = dict_information_one_patient[ss[0]] # 拿到该病人字典中已经存在的信息
  34. y = dict_inform_image # 新的信息
  35. new_x = dict(x, **y) # 合并dict
  36. dict_information_one_patient[ss[0]] = new_x
  37. except:
  38. print(name)
  39. continue
  40. print(dict_information_one_patient)
  41. np.savetxt("./dict_patient.txt", np.reshape(dict_information_one_patient, -1), delimiter=',', fmt='%5s')

上面的处理比较的复杂,但是你不必为怎么得到要保存到字典内的key和value操心,重点关注与如何将字典内的value值保存到字典内,以及如何判断该key是否已经在电脑内了,如何合并俩value,然后嵌套字典,这块都用--------进行了标注。

保存这块字典2层嵌套时候,目的是:

  1. 保持字典的key不变
  2. 对应的value改变,不断的将新加进来的数据,进行更新

保存的文件结果,如下面截图这样(太小可点击图像,放大查看)

上面就是保存后的结果,不太好看,经过sublime text整理后,如下清晰所示

最后,总结下记录这个嵌套字典的作用。在某些数据处理中,存在这种局部处理和全局处理的情况

而最终的数据呈现又需要采用全局的方式从整体上进行分析,此时就可以采用这种嵌套式字典的形式,先暂时的将满足该大key的value进行保存。

其中大value下又存在小key和小value的情况,可以在最后统一对所有满足大key的value进行处理。拥有全局观。也可以采用一下的方式进行字典的嵌套,如下:

  1. {
  2. oneClassMate['three class'] = {
  3. "xiaohong":{
  4. "sex":'female',
  5. 'age':'18',
  6. 'like':'apple'
  7. },
  8. "lily":{
  9. "sex":'female',
  10. 'age':'16',
  11. 'like':'apple'
  12. },
  13. "Tom":{
  14. "sex":'male',
  15. 'age':'19',
  16. 'like':'noddle'
  17. }
  18. },
  19. oneClassMate['four class'] = {
  20. "Mical":{
  21. "sex":'female',
  22. 'age':'18',
  23. 'like':'apple'
  24. },
  25. "ethon":{
  26. "sex":'female',
  27. 'age':'16',
  28. 'like':'apple'
  29. },
  30. "ajun":{
  31. "sex":'male',
  32. 'age':'19',
  33. 'like':'noddle'
  34. }
  35. }
  36. }

这种也是常用的数据形式,这块把字典叠到一起的操作,就比较的简单了。只是说我的key对应的value不是一个实数,而是一个字典


二、python读取txt格式文件来创建一个存储字典

法1:

  1. def main(path):
  2. dict_data={}
  3. with open(path,'r') as f:
  4. txt=f.read()
  5. for t in txt.split():
  6. key,value=t.split(':')
  7. if not key in dict_data:
  8. dict_data[key]=value
  9. print(dict_data)
  10. if __name__=='__main__':
  11. txtpath="D:\\test.txt"
  12. main(txtpath)

法2:

  1. def main(path):
  2. dict_data = {}
  3. with open(path, 'r') as f:
  4. for kv in [d.strip().split(':') for d in f]:
  5. dict_data[kv[0]] = kv[1]
  6. print(dict_data)
  7. if __name__=='__main__':
  8. txtpath="D:\\test.txt"
  9. main(txtpath)

 两张之间是有一定的差别的,第一种方法,会检查是否存在了key,存在就不在存进去了;第二种方法不管,有就存,然后替代


三、关于字典dict的一些其他常用操作

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. id={'123':'ab','456':'cd'}
  4. #添加字典元素
  5. id['789']='ef'
  6. #删除
  7. del id['123']
  8. #更改
  9. id['456']='ookk'
  10. print(id)
  11. #遍历字典
  12. for key,value in id.items():
  13. print(key)
  14. print(value)
  15. print('\n')
  16. #遍历字典的键
  17. for key in id.keys():
  18. print(key)
  19. #等价于上
  20. for key in id:
  21. print(key)
  22. print(type(id.keys()))
  23. #对key,value进行排序输出
  24. for key in sorted(id.keys()):
  25. print(key)
  26. for value in sorted(id.values()):
  27. print(value)
  28. print("\n")
  29. #遍历字典的值
  30. for value in id.values():
  31. print(value)
  32. print("\n")
  33. #去重set集合
  34. for value in set(id.values()):
  35. print(value)
  36. print("\n")
  37. #字典列表
  38. id1={'id':'123','name':'bf'}
  39. id2={'id':'234','name':'ef'}
  40. ids=[id1,id2]
  41. print(ids)
  42. print('\n')
  43. #字典嵌套,适用于多个结构相同的字典保存
  44. usernames={
  45. 'bfss':{
  46. 'name':'ss',
  47. 'tel':'134'
  48. },
  49. 'ssff':{
  50. 'name':'dd',
  51. 'tel':'187'
  52. }
  53. }
  54. print(usernames)

更多的字典相关操作,可以参考这里:Python数据系列(二)- 字典Dictionary:Python的“大胃王”icon-default.png?t=N7T8https://blog.csdn.net/wsLJQian/article/details/103496282?spm=1001.2014.3001.5501

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/365257
推荐阅读
相关标签
  

闽ICP备14008679号