字典是另一种可变容器模型,且可存储任意类型对象.
一、字典的创建
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,
格式如下所示:
dict={key1:value1,key2:value2}
键必须是唯一的,但值则不必.不允许同一个键出现两次创建时如果同一个键被赋值两次,后一个值会被记住并且覆盖上一个值
值可以取任何数据类型,但键必须是不可变得如字符串/数字/元组.而列表则不行
二、字典的增删改查
<1>增;
d['不在d里的键']=值
stus={'张三':16,'李四':19} dit={'爱好':['吃','烫头']} stus['小明']=20 stus['小明']=25#覆盖上一个值20将不显示 print(stus)
执行命令得
{'张三': 16, '李四': 19, '小明': 25}
<2>删:
del d['删除的键']如果不存在就抛异常
pop('删除的键[,default]') default:默认值 如果删除键存在则返回键值否则返回默认值
stus={'张三':16,'李四':19} del stus['张三']#如果无'张三'得键则会抛异常 print(stus) ret=stus.pop('小明1','无此key')#[,default]当删除的key不存在返回的值系统不抛异常 print(ret)
执行命令得
{'李四': 19} 无此key
<3>改:
d['需要修改的键']=值 如果此键不存在就变成了增加此键
stus={'张三':16,'李四':19} stus['张三']=20 print(stus)
执行命令得
{'张三': 20, '李四': 19}
<4>查:
d.get('键','默认值') 需要查询的键不存在则返回默认值不抛异常
stus={'张三':16,'李四':19} print('小明年龄',stus.get('小明',不存在)) print('小明年龄',stus.get('小明1',不存在)) print('张三年龄'.stus['张三'])#党茶渠key不存在时抛异常不建议使用
执行命令得
小明年龄 20 小明1年龄 不存在 张三年龄 16
三、字典的遍历
len(d)元素个数
d.keys()获取字典的键
values()获取字典的键值
items()得到每个键值对得元组 item[0]代表键 items[1]代表键值
dict={'张三':18,'李四':20} print(len(dict)) for key in dict.keys(): print(key) for value in dict.values(): print(value) for item in dict.items(): print(item[0],item[1])
执行命令得
2 张三 李四 18 20 张三 18 李四 20
练习
(电话通讯录) 创建2个列表 一个存姓名 一个存手机
=======通讯录管理系统=======
1.增加姓名和手机
2.删除姓名
3.修改手机
4.查询所有用户
5.根据姓名查找手机号
6.退出
============================
phones={'123':'张三','456':'李四'} while True: print('=======通讯录管理系统=======') print('1.增加姓名和手机') print('2.删除姓名') print('3.修改手机') print('4.查询所有用户') print('5.根据姓名查找手机号') print('6.退出') print('============================') num=int(input('请输入数字:')) num=int(input('请输入数字:')) if num==1: name=input('请输入新姓名:') phone=input('请输入新电话:') while phone in phones.keys(): phone=input('电话已存在 请重新输入:') phones[phone]=name print('录入成功') elif num==2: name = input('请输入姓名:') for temp in phones.items(): if temp[1].__eq__(name): phones.pop(temp[0]) print('删除成功') break#当两个名字相同手机号不同时,删除一个加break 如果都删除则不加 else: print('无此用户') elif num==3: phone = input('请输入电话:') if phone in phones.keys(): new_phone=input('请输入新的电话:') while new_phone in phones.keys(): new_phone=input('电话已存在 请重新输入新的电话:') name=phones.pop(phone) phones[new_phone]=name print('修改成功') else: print('无此电话') elif num==4: for temp in phones.items(): print('姓名:'+temp[1],'电话:'+temp[0]) elif num==5: name = input('请输入姓名:') for temp in phones.items(): if temp[1].__eq__(name): print('姓名:'+temp[1],'电话'+temp[0]) elif num==6: print('谢谢使用') break
四、字典的特性
1.不允许同一个键出现两次,创建时如果同一个键被赋值两次,后一个值被记住
2.键必须不可变,所以可以用数字/字符串/元祖充当,而不能用列表
和list比较,dict有以下几个特点:
查找和插入的速度几块,不会随着key得增加而变慢
需要占用大量的内存,内存浪费多.
hashcode 算法
而list是相反:
查找和插入的时间随着元素的增加而增加
占用空间小,浪费内存很少
字典是可以无限嵌套的
citys={ '北京':{ '朝阳':['三里屯','国贸'], '海淀':['中关村','公主坟'], '丰台':['角门西','天台'] }, '河北':{ '廊坊':['大城县','霸州'], '石家庄':['桥西区','桥东区'], } } for city in citys.keys(): print(city) for town in citys.get(city).keys(): print('\t'+town) print('\t\t'+str(citys.get(city).get(town)))
执行命令得
北京 朝阳 ['三里屯', '国贸'] 海淀 ['中关村', '公主坟'] 丰台 ['角门西', '天台'] 河北 廊坊 ['大城县', '霸州'] 石家庄 ['桥西区', '桥东区']
五、字典中的内置函数
序号 | 函数及描述 |
1 | dict.clear() 删除字典的所有元素 |
2 | dict.copy() 复制一个字典内容 3 |
3 | dict.fromkeys() 创建一个新的字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | dict.get(key.default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 | key indict 如果建在字典dict例返回true否则返回false |
6 | dict.items() 以列表返回可遍历的(键 .值)元祖数组 |
7 | dict.keys 以列表返回一个字典所有的键 |
8 | dict.setdefaulet(key.default=None) 和get() 类似 但如果键不存在于字典中,将会添加键和值设为default |
9 | dict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | dict.values() 以列表返回字典中的所有值 |
11 | pop(key[.default]) 删除字典给定健key所对应的值,返回值为被删除的值,key值必须给出.否则fanhuidefault |
12 | popitem() 随机返回并删除字典中的一对键和值(一般删除末尾对) 不建议使用 |