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)字典的创建、修改和读取
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info)
print(info["p1"])
info['p3']="cris"
info['p4']="david"
print(info)
复制代码
输出:
{'p3': 'clark', 'p2': 'bob', 'p1': 'alice'}
alice
{'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,不会报错(报错的话程序无法执行)。
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info["p1"])
print(info.get('p1'))
print(info.get('p5'))
复制代码
输出:
alice
alice
None
复制代码
而如果
print(info["p5"])将得到以下输出:
print(info["p5"])
KeyError: 'p5'
复制代码
程序没有执行,直接退出了。
1.2)字典的删除
del info可以删除整个字典。
del info["p1"]可以删除key值为p1的数据。
info.pop("p1")也是删除key值为p1的数据。
info.popintem()是随机删除一个数据。
问题:有没有一种方法可以判断数据是否在dict里?在,我就去取。不在,我就创建一个新的。
答案:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print('p1' in info)
print('p6' in info)
复制代码
结果:
True
False
复制代码
2 多级字典的嵌套与操作
字典里面可以嵌套字典、列表等其他数据类型,变成一个树状结构。例如多级菜单。
代码:
china = {
'广东':{
'广州':["天河","越秀","海珠"],
'深圳':["罗湖","宝安","福田"]},
'湖南':{
'长沙':["天心","岳麓","芙蓉"],
'岳阳':["岳阳楼区","君山"]}
}
print(china[ '湖南']['岳阳'][1])
复制代码
输出:
君山
复制代码
需要注意:
- key尽量不要写中文!!!
3字典的其他操作
3.1 打印所有值(不包括key)values:
代码:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info.values())
复制代码
输出:
dict_values(['alice', 'bob', 'clark'])
复制代码
3.2 打印所有key:
代码:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info.keys())
复制代码
输出:
dict_keys(['p2', 'p1', 'p3'])
复制代码
3.3 先去取值,取到就读出来,取不到就用后面的赋新值。
代码:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info.setdefault('p1',"amy"))
print(info.setdefault('p4',"amy"))
print(info)
复制代码
输出:
alice
amy
{'p1': 'alice', 'p4': 'amy', 'p2': 'bob', 'p3': 'clark'}
复制代码
可以看到,p1:alice已经存在,所以setdefault不生效,还是alice。但p4:amy在字典中没有,那就字典创造一个新的对象。
3.4 合并字典,如果有相同的值就覆盖update。
update操作会把两个字典合并,如果有相同的值,则用新字典的值覆盖老字典里的值。
代码
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
info1 = {
'p1':"amy", 'p4':"bob", 'p5':"elvis"
}
info.update(info1)
info1.update(info)
print (info)
print (info1)
复制代码
输出:
{'p4': 'bob', 'p5': 'elvis', 'p2': 'bob', 'p1': 'amy', 'p3': 'clark'}
{'p5': 'elvis', 'p1': 'amy', 'p2': 'bob', 'p3': 'clark', 'p4': 'bob'}
复制代码
3.5 把一个字段转成一个列表item
代码:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
print(info.items())
复制代码
输出:
dict_items([('p1', 'alice'), ('p2', 'bob'), ('p3', 'clark')])
复制代码
3.6 初始化生成一个新的字典fromkeys
代码:
print(dict.fromkeys([1,2,3],"alice"))
复制代码
输出:
{1: 'alice', 2: 'alice', 3: 'alice'}
复制代码
3.7 字典的循环
1)第一种循环方式:
代码:
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
for i in info:
print(i)
for i in info:
print(i,info[i])
复制代码
输出:
p1
p3
p2
p1 alice
p3 clark
p2 bob
复制代码
可以看到,前3行输出只有key,没有value。也就是说默认只会输出key。
2)第二种循环方式
和第一种效果是一样的。代码不同。
info = {
'p1':"alice", 'p2':"bob", 'p3':"clark"
}
for k,v in info.items():
print(k,v)
复制代码
输出:
p1 alice
p3 clark
p2 bob
复制代码
需要说明的是,第一种的执行效率比第二种要高很多。优选第一种。(第二种方式是先把字典变成列表,然后再去取,肯定是有损耗更大的)
欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/)
Powered by Discuz! X3