字典是另一种可变容器模型,且可存储任意类型对象.
一、字典的创建
字典的每个键值(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() 随机返回并删除字典中的一对键和值(一般删除末尾对) 不建议使用 |