代码改变世界

Python 字典

2018-04-13 15:34  钱先生  阅读(207)  评论(0编辑  收藏  举报

字典Dictonary

  • 一种key - value的数据类型
  • 语法
1 info = {
2     'stu1101': "Teng",
3     'stu1102': "Long",
4     'stu1103': "Xiao",
5 }
  • dict是无序的, 没有下标
  • key 必须是唯一的

 

字典基本操作

 1 # 创建字典
 2 info = {
 3     'stu1101': "Teng",
 4     'stu1102': "Long",
 5     'stu1103': "Xiao",
 6 }
 7 
 8 print(info)
 9 
10 # 查找方法1, 根据指定key查
11 print(info['stu1101']) # 若key不存在,会出错.
12 
13 
14 # 查找方法2, 根据指定key查
15 print(info.get('stu1104')) # 若key不存在,返回null. 案例的查找方法.
16 
17 
18 # 修改方法1, 根据指定key修改对应值
19 info['stu110'] = 'aa'  # 若key存在,则修改
20 info['stu114'] = 'bb'  # 若key不存在,则添加
21 print(info)
22 
23 
24 # 修改方法2,
25 info2 = {
26     'stu1101':'alex', # info中也有这个键,但值和info2不同.
27     1:3,
28     2:5
29 }
30 info.update(info2) # 把两个字典合并. 其中key有交叉的将对应值修改成info2中的值.
31 
32 
33 # 删除方法1, 根据指定key删
34 del info['stu1101']
35 
36 
37 # 删除方法2, 根据指定key删
38 info.pop('stu1101')
39 
40 
41 # 删除方法3: 随机删
42 info.popitem()
43 
44 
45 # 判断key是否存在于字典中
46 print('stu1105' in info)
47 # info.has_key('stu1105) 和print('stu1105' in info)效果一样,不过这个语句只在python2里有. python3已经去掉.
48 
49 
50 # 取出所有的值
51 info.values()
52 
53 
54 # 取出所有的key
55 info.keys()
56 
57 
58 # 另一种方式的添加. 若key在字典中存在,就返回其对应的值; 若key不存在,则添加进字典.
59 info.setdefault('stu1106','alex')
60 
61 
62 # 将字典转换成列表
63 print(info.items())
64 
65 
66 # 初始化一个新的字典, key就是方法中指定的test
67 c = dict.fromkeys([6,7,8],'test')
68 c2 = dict.fromkeys([6,7,8],[1,{"name":"alex"},444]) # 这样写其实是列表[1,{"name":"alex"},444]整体作为新字典c2的key.
69 print(c)
70 
71 
72 
73 # 循环遍历方法1
74 for i in info:
75     print(i,info[i])
76 # 方法1比方法2高效很多.
77 # 循环遍历方法1
78 for k,v  in info.items():
79     print(k,v)

 

多级字典嵌套

 

 1 # 多级字典嵌套
 2 catalog = {
 3     '欧美':{
 4         'aaa':['abc','cde'],
 5         'bbb': ['abcfew', 'wdfa'],
 6         'ccc': ['vafew', 'avcaf']
 7     },
 8 
 9     '日韩': {
10         'eee': ['aqza', 'wdd'],
11         'fff': ['bcvd', 'gava'],
12         'ggg': ['gdaw', 'aeve']
13     },
14 
15     '中国': {
16         'hhh': ['bfdsf', 'mgt'],
17         'iii': ['hgfhf', 'ytnb'],
18         'jjj': ['jytjt', 'rhdnb']
19     },
20 }
21 
22 # 修改其中一个内嵌字典的值
23 catalog['中国']['hhh'][1] = 'kkyyllla'

 

 

练习: 三级菜单

 1 data={
 2     '北京':{
 3         '昌平': {
 4             '沙河':['oldboy','test'],
 5             '天通苑': ['链家地产','我爱我家']
 6         },
 7 
 8         '朝阳': {
 9             '望京': ['奔驰', '陌陌'],
10             '国贸': ['CICC', 'HP'],
11             '东直门': ['Advent', '飞信'],
12         },
13 
14         '朝阳': {
15             '望京': ['奔驰', '陌陌'],
16             '国贸': ['CICC', 'HP'],
17             '东直门': ['Advent', '飞信'],
18         },
19 
20         '海淀': {
21 
22         },
23     },
24 
25     '山东': {
26         '德州': {},
27         '青岛': {},
28         '济南': {},
29     },
30 
31     '广东': {
32         '东莞': {},
33         '常熟': {},
34         '佛山': {},
35     },
36 }
37 
38 # 循环打印每一级菜单
39 exit_flag = False
40 while not exit_flag:
41     for i in data:
42         print(i)
43 
44     choice = input('去哪? ')
45     if choice in data:
46         while not exit_flag:
47             for i2 in data[choice]:
48                 print("\t",i2)
49 
50             choice2 = input('去哪? ')
51             if choice2 in data[choice]:
52                 while not exit_flag:
53                     for i3 in data[choice][choice2]:
54                         print("\t\t",i3)
55                     choice3 = input('去哪? ')
56                     if choice3 in data[choice][choice2][choice3]:
57                         while not exit_flag:
58                             for i4 in data[choice3]:
59                                 print("\t\t\t",i4)
60 
61                             choice4 = input('最后一层, 按b返回上一层')
62                             if choice4=='b':
63                                 pass # 什么也不做. 一个占位符,防止报错.
64                             elif choice4=='quit':
65                                 exit_flag=True
66                     if choice3 == 'b':
67                          break
68                     elif choice3 == 'quit':
69                         exit_flag = True
70             if choice2 == 'b':
71                 break
72             elif choice2 == 'quit':
73                 exit_flag = True

 优化后代码

 1 menu = {
 2     '北京': {
 3         '昌平': {
 4             '沙河': ['HeiMa', 'test'],
 5             '天通苑': ['链家地产', '我爱我家']
 6         },
 7 
 8         '朝阳': {
 9             '望京': ['奔驰', '陌陌'],
10             '国贸': ['COCO', 'HP'],
11             '东直门': ['Advent', '飞信']
12         },
13         
14         '海淀': {
15             '长安街': ['UNIQUE', 'SINGLE'],
16             '东门街': ['国贸', '东门']
17         },
18     },
19 
20     '山东': {
21         '德州': {
22             '大安': ['人民广场', '黄埔路', '南京东路'],
23             '东建': ['西顶广场', '长河路', '北安路']
24         },
25         '青岛': {
26             '东海': ['创意广场', '文化广场'],
27             '渤海湾': ['创意广场', '文化广场']
28         },
29         '济南': {
30             '南山': ['东门', '北门'],
31             '钟南山': ['南门', '西门']
32         },
33     },
34 
35     '广东': {
36         '东莞': {
37             '金湾': ['APPLE', 'PAD'],
38             '银湾': ['GOLD', 'SLIVER']
39         },
40         '常熟': {
41             '天安': ['PHONE', 'WATCH'],
42             '地安': ['SET', 'INFLATION']
43         },
44         '佛山': {
45             '越秀': ['海洋公园', '湿地公园'],
46             '天河': ['海上公园', '动物乐园']
47         },
48     },
49 }
50 
51 upper_level = []
52 curr_menu = menu
53 while True:
54 
55     # 循环打印每一级菜单
56     for i in curr_menu:
57         print(i)
58 
59     # 用户选择
60     choice = input('去哪? ')
61 
62     if choice == 'back':
63         if len(upper_level) > 0:  # 代表有下一层
64             curr_menu = upper_level.pop()  # 提取upper_level的最后一个元素并删掉(模拟返回上一级菜单结果)
65         else:
66             print('这是最项层')
67         continue
68     elif choice == 'quit':
69         exit(0)
70 
71     if isinstance(curr_menu, dict) :
72         # 如果当前层是字典,还有下一级, 可以继续
73         if choice in curr_menu:
74             upper_level.append(curr_menu)  # 把当前层的引用添加到上级菜单的历史列表
75             curr_menu = curr_menu[choice]
76         else:
77             print('输入有误')
78         continue
79     if isinstance(curr_menu, list):
80         print('这是最后一层')
81         continue