51学通信论坛2017新版

标题: 1.13 字典数据类型与操作(非常常用) [打印本页]

作者: 爱卫生    时间: 2017-12-14 10:02
标题: 1.13 字典数据类型与操作(非常常用)
本帖最后由 爱卫生 于 2017-12-15 10:29 编辑

1 字典基础
字典的特性:
- dict是无序的
- key必须是唯一的- key-value对的数据类型
(列表的读取是通过找到元素的位置及下标来读取的)
字典可以存储更复杂的信息,列表做不到。比如每个人都有很多标签,例如身高、体重、地址、年龄。。。这个是列表做不到的或者极其麻烦。
而且即便存下来了,要取出来也极其麻烦。需要死记硬背在列表中的位置(这个位置叫下标)。
dict的查询和我们查新华字典其实是一样的。新华字典就是找目录比如A开头的在第几页,然后就翻到第几页就找到了。
1.1)字典的创建、修改和读取
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info)
  5. print(info["p1"])
  6. info['p3']="cris"
  7. info['p4']="david"
  8. print(info)
复制代码
输出:
  1. {'p3': 'clark', 'p2': 'bob', 'p1': 'alice'}
  2. alice
  3. {'p4': 'david', 'p3': 'cris', 'p2': 'bob', 'p1': 'alice'}
复制代码
可以看到,dict的输出是无序的。通过key值如p1来读取数据。如果该key值不存在(如p4),则会在dict中增加一个新数据(如david)。dict中的数据除了info[key]来读取,还有一种方式。因为info[key]读取的话,需要事先知道这个数据一定存在,否则会报错。
用info.get[key]就不会报错了。将print(info["p1"])改为以下代码,可以得到同样的效果,但如果p1不存在,就会输出none,不会报错(报错的话程序无法执行)。
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info["p1"])
  5. print(info.get('p1'))
  6. print(info.get('p5'))
复制代码
输出:
  1. alice
  2. alice
  3. None
复制代码
而如果print(info["p5"])将得到以下输出:
  1.   print(info["p5"])
  2. KeyError: 'p5'
复制代码
程序没有执行,直接退出了。

1.2)字典的删除
del info可以删除整个字典。
del info["p1"]可以删除key值为p1的数据。
info.pop("p1")也是删除key值为p1的数据。
info.popintem()是随机删除一个数据。

问题:有没有一种方法可以判断数据是否在dict里?在,我就去取。不在,我就创建一个新的。答案:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print('p1' in info)
  5. print('p6' in info)
复制代码
结果:
  1. True
  2. False
复制代码

2 多级字典的嵌套与操作
字典里面可以嵌套字典、列表等其他数据类型,变成一个树状结构。例如多级菜单。
代码:
  1. china = {
  2.     '广东':{
  3.         '广州':["天河","越秀","海珠"],
  4.         '深圳':["罗湖","宝安","福田"]},
  5.     '湖南':{
  6.         '长沙':["天心","岳麓","芙蓉"],
  7.         '岳阳':["岳阳楼区","君山"]}
  8.     }
  9. print(china[ '湖南']['岳阳'][1])
复制代码
输出:
  1. 君山
复制代码
需要注意:
- key尽量不要写中文!!!


3字典的其他操作
3.1 打印所有值(不包括key)values:代码:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info.values())
复制代码
输出:
  1. dict_values(['alice', 'bob', 'clark'])
复制代码
3.2 打印所有key:代码:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info.keys())
复制代码
输出:
  1. dict_keys(['p2', 'p1', 'p3'])
复制代码
3.3 先去取值,取到就读出来,取不到就用后面的赋新值。代码:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info.setdefault('p1',"amy"))
  5. print(info.setdefault('p4',"amy"))
  6. print(info)
复制代码
输出:
  1. alice
  2. amy
  3. {'p1': 'alice', 'p4': 'amy', 'p2': 'bob', 'p3': 'clark'}
复制代码
可以看到,p1:alice已经存在,所以setdefault不生效,还是alice。但p4:amy在字典中没有,那就字典创造一个新的对象。

3.4 合并字典,如果有相同的值就覆盖update。
update操作会把两个字典合并,如果有相同的值,则用新字典的值覆盖老字典里的值。
代码
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. info1 = {
  5.     'p1':"amy",    'p4':"bob",    'p5':"elvis"
  6. }
  7. info.update(info1)
  8. info1.update(info)
  9. print (info)
  10. print (info1)
复制代码
输出:
  1. {'p4': 'bob', 'p5': 'elvis', 'p2': 'bob', 'p1': 'amy', 'p3': 'clark'}
  2. {'p5': 'elvis', 'p1': 'amy', 'p2': 'bob', 'p3': 'clark', 'p4': 'bob'}
复制代码
3.5 把一个字段转成一个列表item
代码:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. print(info.items())
复制代码
输出:
  1. dict_items([('p1', 'alice'), ('p2', 'bob'), ('p3', 'clark')])
复制代码
3.6 初始化生成一个新的字典fromkeys
代码:
  1. print(dict.fromkeys([1,2,3],"alice"))
复制代码
输出:
  1. {1: 'alice', 2: 'alice', 3: 'alice'}
复制代码
3.7 字典的循环
1)第一种循环方式:
代码:
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. for i in info:
  5.     print(i)
  6. for i in info:
  7.     print(i,info[i])
复制代码
输出:
  1. p1
  2. p3
  3. p2
  4. p1 alice
  5. p3 clark
  6. p2 bob
复制代码
可以看到,前3行输出只有key,没有value。也就是说默认只会输出key。

2)第二种循环方式
和第一种效果是一样的。代码不同。
  1. info = {
  2.     'p1':"alice",    'p2':"bob",    'p3':"clark"
  3. }
  4. for k,v in info.items():
  5.     print(k,v)
复制代码
输出:
  1. p1 alice
  2. p3 clark
  3. p2 bob
复制代码
需要说明的是,第一种的执行效率比第二种要高很多。优选第一种。(第二种方式是先把字典变成列表,然后再去取,肯定是有损耗更大的)




欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/) Powered by Discuz! X3