【练习】字典的循环遍历:实现多层级节点存取

关键点:字典、列表、集合等可变类型,若将一个可变类型赋给变量A和B,通过B改变了该可变类型内部的元素,指向该可变类型内存地址的变量A的值一样会跟着改变(因A、B同时指向了一个内存地址)

>>> a={"AB":"ab","CD":"cd"}
>>> b=a
>>> id(a)
33380536
>>> id(b)
33380536
>>>
>>> b["AB"]="efg"
>>> b
{'AB': 'efg', 'CD': 'cd'}
>>> a
{'AB': 'efg', 'CD': 'cd'}
>>> id(a)
33380536
>>> id(b)
33380536
>>>

 

题目:利用字典实现多层级节点的增加、查询功能,并且通过pickle序列化的方式保存为文件。

 1 import pickle
 2 import os
 3 import time
 4 
 5 if os.path.isfile('db.pk1'):
 6     print("载入数据库,请稍候…………")
 7     time.sleep(2)
 8     f = open("db.pk1", "rb")
 9     db = pickle.load(f)
10     f.close()
11     print("数据库加载完毕。")
12     path = []
13     while True:
14         tmp = db
15         if path:
16             for item in path:
17                 if item in list(tmp.keys()):
18                     tmp = tmp[item]
19                 else:
20                     print("无此节点,请重新输入")
21         print("当前节点下的子节点为:", list(tmp.keys()))
22 
23         choice = input("请选择:1、查看节点\t2、添加节点\t3、返回上级\t4、退出\n>>>>>")
24         if choice == "1":
25             n = input("请输入节点名称>>>")
26             path.append(n)
27 
28         elif choice == "2":
29             name = input("请输入节点名称:")
30             tmp[name] = {}
31         elif choice == "3":
32             if path:
33                 path.pop()
34             else:
35                 print("已经是根节点,无法返回。")
36         elif choice == "4":
37             print("保存数据库,请稍等……")
38             time.sleep(2)
39             f = open("db.pk1", "wb")
40             pickle.dump(db, f, True)
41             print("保存成功,程序退出。")
42             break
43         else:
44             print("输入错误请重新输入")
45 elif not os.path.isfile('db.pk1'):
46     choice1 = input("数据库不存在,是否初始化数据库:Y\\N\n>>>")
47     if choice1.lower() == "y":
48         db = {}
49         time.sleep(2)
50         f = open("db.pk1", "wb")
51         pickle.dump(db, f, True)
52         f.close()
53         print("初始化成功。")
54         
55     elif choice1.lower() == "n":
56         print("无法初始化数据库,程序退出。")

 

posted @ 2018-03-23 15:41  苦逼工程师  Views(1236)  Comments(0Edit  收藏  举报