python -- 字典
python -- 字典
字典是用{}表示。
字典是一种key – value的数据类型。
字典的格式:
name = {
'stu01': 'Gao',
'stu02': 'Zhang',
'stu03': 'Liu',
'stu04': 'Wang',
}
name2 = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# name 和name2 打印出来的效果是一样
# <class 'dict'>
print(type(name))
# <class 'dict'>
print(type(name2))
print(name)
print(name2)
取字典的value值 dict.get('key')
name = {
'stu01': 'Gao',
'stu02': 'Zhang',
'stu03': 'Liu',
'stu04': 'Wang',
}
# Gao
print(name['stu01'])
# 由于stud05不在字典里,所以会报错
# KeyError: 'stu05'
print(name['stu05'])
#为了避免查找key值不在的报错,建议使用
# None
print(name.get('stu05'))
# Zhang
print(name.get('stu02'))
修改字典的value值
name = {
'stu01': 'Gao',
'stu02': 'Zhang',
'stu03': 'Liu',
'stu04': 'Wang',
}
# 修改stu02的value值
name['stu02'] = '张'
# 修改stu05的value值,但是stu05这个key没有,所以就新建了一个对应关系
name['stu05'] = '李四'
# {'stu01': 'Gao', 'stu02': '张', 'stu03': 'Liu', 'stu04': 'Wang', 'stu05': '李四'}
print(name)
字典的删除 del dict['key'] dict.pop('key') dict.popitem()
name = {
'stu01': 'Gao',
'stu02': 'Zhang',
'stu03': 'Liu',
'stu04': 'Wang',
}
# {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)
# 用del删除字典中的key值
del name['stu01']
# {'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)
# 用dict.pop('key')删除指定的key值,不过这里会有返回值
# 返回值: Wang
print(name.pop('stu04'))
# {'stu02': 'Zhang', 'stu03': 'Liu'}
print(name)
# 用dict.popitem()随机删除key值,并且返回key-value关系
# 返回值: ('stu03', 'Liu')
print(name.popitem())
# {'stu02': 'Zhang'}
print(name)
字典的生成
用户自己生成字典
dic = {}
for i in range(5):
a = input("Enter the dict'key:")
b = input("Enter the dict'value:")
dic[a] = b
print(dic)
多级字典嵌套及操作
字典可以再套字典,最终成为一个树状结构。
map = {
'浦西':{
'黄浦区':{
'城隍庙':['小吃','九曲桥','绿波廊'],
'南京路步行街':['第一百货','沈大成','永安百货'],
},
'徐汇区':{
'徐家汇':['百脑汇','汇金百货','港汇广场'],
'龙华寺':['古寺之一','风水宝地','烧香灵'],
},
'静安区':{
'马戏城':['时空之旅','马戏','特技表现'],
'大灵灵石公园':['郁金香展','人工湖划船','婚纱拍摄地'],
},
},
'浦东':{
'浦东新区':{
'东方明珠':['上海标志性地标','太空舱','旋转餐厅'],
'海洋水族馆':['亚洲第一','海底隧道','28个主题馆'],
},
'原川沙':{
'迪士尼乐园':['大陆第一','七大主题乐园','两座主题酒店'],
},
'原南汇':{
'野生动物园':['首座国家级野生动物园','两大参观区','AAAAA'],
'南汇鲜花港':['多肉展','百合花展','菊花展'],
},
},
'崇明':{
'中北部':{
'东平森林公园':['AAAAA','华东区最大的人造平原森林','上海著名旅游胜地'],
},
'南部':{
'西沙湿地':['候鸟','日落','观潮'],
},
'西部':{
'明珠湖':['天然湖泊','鸬鹚保护地','扶摇直上'],
},
},
}
a = map['浦东']['原南汇']['南汇鲜花港']
# ['多肉展', '百合花展', '菊花展']
print(a)
# 多肉展
print(a[0])
字典的操作
- keys dict.keys()
- values dict.valuse()
name = {
'stu01': 'Gao',
'stu02': 'Zhang',
'stu03': 'Liu',
'stu04': 'Wang',
}
# 打印dict的key值
# dict_keys(['stu01', 'stu02', 'stu03', 'stu04'])
print(name.keys())
# 打印dict的value值
# dict_values(['Gao', 'Zhang', 'Liu', 'Wang'])
print(name.values())
- setdefalut dict.setdefault('key','value')
name = {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], }
# 使用setdefault时候,对于没有的key-value会加上,如果有就忽略,不修改
# setdefault并不会将Li转换成列表的格式加入字典,还是将它作为str传入
name.setdefault('stu05', 'Li')
name.setdefault('stu04', 'LiLi')
# {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], 'stu05': 'Li'}
print(name)
- update dict1.update(dict2)
name = {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], }
dic = {'stu01': ['GG'], '1': '2', }
# 用update会将update内的字典更新到老的里面去,同时新字典中和老字典有相同key的话,新的value代替老的value
# update需要函数内的参数也要是字典
name.update(dic)
# {'stu01': ['GG'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], '1': '2'}
print(name)
- items dict.items() 返回字典dict的(key,value)元组对的列表
name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# dict.items()将字典变成一个列表,还是一个dict_items类型
# dict_items([('stu01', 'Gao'), ('stu02', 'Zhang'), ('stu03', 'Liu'), ('stu04', 'Wang')])
print(name.items())
# type = <class 'dict_items'>
tmp = name.items()
# <class 'dict_items'> todo 日后详解
print(type(tmp))
- fromkeys dict.fromkeys(['str1','str2'],'value') 初始化一个字典,浅初始化
name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# 用fromkey是()初始化一个新的字典,并且key对于的key值都是test01
dic = dict.fromkeys([1, 2, 3], 'test01')
# fromkey是()初始化一个新的字典,并且key对于的key值都是None
dic1 = dict.fromkeys([0, 9, 8])
# {1: 'test01', 2: 'test01', 3: 'test01'}
print(dic)
# None, 9: None, 8: None}
print(dic1)
# 下面只是初始化一个字典,但是和name这个字典没有半毛线关系。只是生成字典,并未赋值给变量name。
name.fromkeys([1, 2, 3], 'test01')
# {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)
使用fromkeys另外注意的事
通过fromkeys生产的字典,如果存在嵌套关系,在修改嵌套里的数据时,那些key也会跟着一起改变。原理同浅copy。
dic = dict.fromkeys([1, 2, 3], {'name':['ID','Sex','Age']})
# {1: {'name': ['ID', 'Sex', 'Age']}, 2: {'name': ['ID', 'Sex', 'Age']}, 3: {'name': ['ID', 'Sex', 'Age']}}
print(dic)
# 修改dic对于的1可以的name的‘ID’,为'ID Card'
dic[1]['name'][0] = 'ID Card'
# {1: {'name': ['ID Card', 'Sex', 'Age']}, 2: {'name': ['ID Card', 'Sex', 'Age']}, 3: {'name': ['ID Card', 'Sex', 'Age']}}
print(dic)
字典的循环
name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# 循环打印name中的key值
for i in name:
print(i)
# 循环打印name中的value值
for j in name:
print(name[j])
# 建议使用以下方式打印key-value的关系,相对下面的循环,高效
for l in name:
print(l,name[l])
# 循环打印name中的key和value值,字典转成列表的过程,在数据多的时候,就麻烦了
for k,v in name.items():
print(k,'=',v)
# k,v 可以随意编写,因为他们就是一个临时变量而已。
写在后面
字典的特征:
- 字典是无序的,没有下标
- key必须是唯一,所以字典不会有重复的key
- 取字典key值,建议使用dict.get('key')的方式
- dict.pop('key'),返回value值,同时把相对于的key值也删除。建议使用这样方式删除dict的key。
- dict.popitem(),随机删除key,告知key对应的value,返回值是一个元组(key,vlaue)。
- dict1.update(dict2),会将update内的字典更新到老的里面去,同时新字典中和老字典有相同key的话,新的value代替老的value
- dict.fromkeys(['key1','key2'],'value'),可以不依附任何原有的字典编写
- dict.fromkeys(['key1',key2],'value'),建议只创建一层key-value关系,除非特殊使用。原因:浅copy。
- 字典的循环,不建议使用dict.items(),因为吃资源较多,且低效。
| 作用 | 代码 | 用法 | 备注 |
|---|---|---|---|
| 取key | keys | dict.keys() | |
| 取value | values | dict.values() | |
| 取value | get | dict.get('key') | 有,返回;没有。返回None |
| 删除 | del | del dict['key'] | 系统中功能 |
| 删除 | pop | dict.pop('key') | 定向删除key,并且返回key对于的value值 |
| 删除 | popitem | dict.popitem() | 随机删除一个key,并且返回key-value关系 |
| 增加 | setdefault | dict.setdefault('key','value') | 如有,不改;没有,新增 |
| 升级 | update | dict1.update(dict2) | 如有重复key,dict2的值替换dict1 |
| 关系图 | items | dict.items() | 返回(key-value)对应图,列表性质 |
| 初始化 | fromkeys | dict.fromkeys(['key1',['key2']],'value') | 初始化key-value关系,无需依附任何dict |

浙公网安备 33010602011771号