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

关键点:字典、列表、集合等可变类型,若将一个可变类型赋给变量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("无法初始化数据库,程序退出。")

原文地址:https://www.cnblogs.com/morries123/p/8630677.html

时间: 2024-08-04 13:58:39

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

swift基本用法-for循环遍历,遍历字典,循环生成数组

// Playground - noun: a place where people can play import UIKit //------------------------------------------------------------------------------ // 1. for // 传统的for循环方式在swift中同样支持 var num = 0 for(var i = 0; i < 10 ; i++) { num += i } num //---------

Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化

Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合  (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏有对性能方面问题的细微考虑. 对于速度的追求 首先,是一个免责声明: 相比其它问题而言,一个 Objective-C 方法原始的速度是你在编程时最后才需要考虑的问题之一 – 区别就在于这个问题够不上去同其它更加需要重点考虑的问题进行比较,比如说代码的清晰度和可读性. 但速度的次要性并不妨碍我们去理解

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判定玩家是否有权限做出这种选择,然后才决定是否为玩家执行此选择.例如,<仙剑奇侠传>这款游戏,进入剧情"荷叶迷宫时",会要求玩家击碎迷宫里的5尊雕塑,如图5-12所示.但是击碎的前提是,玩家身上必须携带有"锤子".也就是说系统会遍历玩家身上所有的资源,如果有锤

复习 使用for、while循环遍历文件,数据类型转换

1. python访问文件 通过内置函数open打开文件,看一下open函数解释: 打开文件 返回的是一个文件对象 fd = open('/tmp/tmp.txt') 查看他的方法: 关闭文件: fd.close() 向文件内写入: fd = open('/tmp/tmp.txt', 'w') 这样打开文件等于重写文件,文件原有的内容就覆盖掉了 fd.write("a") 这样写入文件,写入文件后不能查看到,我们必须把他关闭: fd.close() 关闭之后,就可以查看到文件内的信息了

To Java程序员:切勿用普通for循环遍历LinkedList

ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: public static void main(String[] args) { List<Integer> arrayList = new ArrayList<Integer>(); for (int i = 0; i < 100; i++) arrayList.add(i);

c# winform 循环遍历界面上的所有控件,foreach,Controls,AllowDrop

foreach (System.Windows.Forms.Control control in this.groupBox2.Controls)//遍历groupBox2上的所有控件 { if (control is System.Windows.Forms.PictureBox) { System.Windows.Forms.PictureBox pb = (System.Windows.Forms.PictureBox)control; pb.AllowDrop = true; } if

JS完成页面跳转并传参的方法|附加:循环遍历对象

此方法只能传递较少参数 方法如下: <a href='page/index.html'>跳转</a> 以上是正常写法,如果要传参按一下写法: <!--参数写在?后面,多个参数用&隔开,下面传的参数为name=lemon,age=18--> <a href='page/index.html?name=lemon&age=18'></a> 当跳转到页面的时候这个页面的地址栏就会跟你写的那个一样,这时候你只需要获取地址栏的内容并进行采取

Java:集合for高级循环遍历

增强for循环: 格式:for(变量数据类型 要遍历的变量 :元素所在数组(集合)名称) 也即 for(Type element: array或collection) 使用foreach遍历集合: 只能获取集合中的元素,不能对集合进行操作. 而迭代器Iterator除了可以遍历,还可以对集合中的元素遍历时进行remove操作. 如果使用ListIterator还可以在遍历过程中进行增删改查的动作. //例子1: import java.util.*; class Foreach { public

Android中List循环遍历性能对比

在android开发中只要是列表式风格界面我们几乎都需要用到List来存放数据,在数量很少的List的话几乎任何一种循环遍历方式整体性能都无差别,但是当我们遇到数据量稍大的时候有必要考虑用哪种方式写起来比较高性能. 常见的有以下三种: 第一种 for (String s : tests) { // .... } 第二种 int size = tests.size(); for (int i = 0; i < size; i++) { tests.get(i); } 第三种 Iterator<S