python (字典,增删改查,其他操作方法)
python (字典,增删改查,其他操作方法)
一、字典
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。
存储大量的数据,是关系型数据,查询数据快。
列表是从头遍历到尾
字典使用二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
比如字典有1~100的数据,现在想要查找75。
先劈一半,找到中间值50。判断50和75的大小,发现小于,再劈一半。
找到中间值75,直接返回结果。
对于字符串查找
每一个字符串,都有一个hash值,是唯一的。
1
|
print ( hash ( 'a' )) |
执行输出:
977260134378667761
1
|
print ( hash ( 'afdsfeye' )) |
执行输出:
-8718419340409073569
字典可以存放各种数据类型
1
2
3
4
5
6
7
|
dic = { 'name' : '老男孩' , 'age' : 17 , 'name_list' :[ '张三' , '李四' ], 1 : True ... } |
数据类型的分类:
可变数据类型(不可哈希):list,dict,set
不可变数据类型(可哈希):int,bool,str,tuple
容器类型:
容器类(承载各种数据类型):list,tuple,dic
字典的键:必须是不可变数据类型
字典的值:任意数据类型。
字典的键是唯一的。
数据类型分类,主要是可变和不可变
字典的顺序:
严格意义上来讲,是无序的
3.5之前,字典是无序的
3.6开始,字典创建的时候,按照一定的顺序插入的值,看起来是有序的
下面介绍字典的增删改查
增
第一种:
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic[ 'hobby' ] = 'girl' print (dic) |
执行输出:
{'age': 21, 'hobby': 'girl', 'name': 'xiao'}
第二种:
setdefault() 无则添加,有则不变
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic.setdefault( 'hobby' ) print (dic) |
执行输出:
{'hobby': None, 'name': 'xiao', 'age': 21}
dic.setdefault('hobby') 虽然只指定了key,没有指定value,默认会填充None
添加键值对
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic.setdefault( 'hobby' , 'girl' ) print (dic) |
执行输出:
{'age': 21, 'name': 'xiao', 'hobby': 'girl'}
添加一个已经存在的key
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic.setdefault( 'name' , '江疏影' ) print (dic) |
执行输出:
{'name': 'xiao', 'age': 21}
上述2个添加的方法,只能一个个添加。
删
pop() 删除指定的key
pop()是所有方法中,唯一有返回值的。
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.pop( 'age' )) print (dic) |
执行输出:
21
{'name': 'xiao'}
删除一个不存在的key
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.pop( 'hobby' )) print (dic) |
执行报错: KeyError: 'hobby'
删除一个不存在的key,并指定默认返回值None
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.pop( 'hobby' , None )) print (dic) |
执行输出:
None
{'age': 21, 'name': 'xiao'}
推荐使用上述方法,删除一个key。因为如果key不存在时,不会报错,返回None。程序员最怕报错了!
clear() 清空
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic.clear() print (dic) |
执行输出:
{}
del 删除字典
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } del dic |
del也可以删除指定的key,如果不存在,会报错
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } del dic[ 'hobby' ] |
推荐使用pop删除,并指定None
popitem() 随机删除,有返回值
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.popitem()) print (dic) |
执行输出:
('age', 21)
{'name': 'xiao'}
在3.6版本,会删除最后一个。
在抽签场景中,可能会用到此方法。
改
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } dic[ 'name' ] = 'zhangsan' print (dic) |
执行输出:
{'name': 'zhangsan', 'age': 21}
update() 针对2个字典的修改
1
2
3
4
5
6
|
dic = { 'name' : 'jin' , 'age' : 21 , 'sex' : 'male' } dic2 = { 'name' : 'sun' , 'weight' : 76 } #将dic键值对,覆盖并添加到dic2 dic2.update(dic) print (dic) print (dic2) |
执行输出:
{'sex': 'male', 'name': 'jin', 'age': 21}
{'weight': 76, 'name': 'sun'}
可以发现dic没有改变,dic2改变了
update()修改原则
有相同的就覆盖,没有的就添加
查
通过key查找
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic[ 'name' ]) |
执行输出:
xiao
通过value查询
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic[ 'xiao' ]) |
执行报错: KeyError: 'xiao'
字典只能通过key查询,不能通过value查询,否则报错
get() 通过key查询
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.get( 'name' )) |
执行输出:
xiao
查询一个不存在的key
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.get( 'hobby' )) |
执行输出:
None
默认的None返回值是可以改变的
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.get( 'hobby' , '亲,木有这个字哦!' )) |
执行输出:
亲,木有这个字哦!
如果需要查询多个key,请使用for循环
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } for i in dic: print (i) |
执行输出:
age
name
其它操作方法:
keys() values() items()
keys()
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } print (dic.keys()) print ( type (dic.keys())) |
执行输出:
dict_keys(['name', 'age'])
<class 'dict_keys'>
keys()方法输出的数据是一个特殊类型,它相当于把所有的key放到了一个容器里面。
它类似于列表的容器,当它并不是列表。
它可以循环
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } for i in dic.keys(): print (i) |
执行输出:
age
name
values()
把所有的value放到一个容器里面
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } for i in dic.values(): print (i) |
执行输出:
xiao
21
items()
将键值对作为一个整体,放到元组中。集中放到一个容器中。
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } for i in dic.items(): print (i) |
执行输出:
('age', 21)
('name', 'xiao')
特殊类型转换为列表
1
2
|
dic = { 'name' : 'xiao' , 'age' : 21 } print ( list (dic.keys())) |
执行输出:
['age', 'name']
分别循环key和value
1
2
3
|
dic = { 'name' : 'xiao' , 'age' : 21 } for k,v in dic.items(): print (k,v) |
执行输出:
age 21
name xiao
现有如下字典,需要遍历key
1
|
dic = { 'name' : 'xiao' , 'age' : 21 } |
第一种写法:
1
2
|
for i in dic.keys(): print (i) |
第二种写法:
1
2
|
for i in dic: print (i) |
以上2段代码,功能是一样的。推荐使用第二种。
概念: 分别赋值
比如
1
2
|
a,b = 2 , 3 print (a,b) |
执行输出:
2 3
面试题:
a = 4,b = 5,请用一行代码,将a和b的值互换。
答案
1
|
a,b = b,a |
字典的嵌套
出一个题目
1
2
3
4
|
dic = { 'name_list' :[ '张三' , 'lisi' , '隔壁王叔叔' ], 'dic2' :{ 'name' : '太白' , 'age' : 12 } } |
1. 给列表追加一个元素:'旺旺'
2. 给列表lisi全部大写
3. 给dic2 对应的字典添加一个键值对:hobby:girl
答案:
1
2
3
4
5
6
7
8
9
|
#1. dic[ 'name_list' ].append( '旺旺' ) print (dic) #2. dic[ 'name_list' ][ 1 ] = dic[ 'name_list' ][ 1 ].upper() print (dic) #3. dic[ 'dic2' ][ 'hobby' ] = 'girl' print (dic) |
执行输出:
{'name_list': ['张三', 'lisi', '隔壁王叔叔', '旺旺'], 'dic2': {'name': '太白', 'age': 12}}
{'name_list': ['张三', 'LISI', '隔壁王叔叔', '旺旺'], 'dic2': {'name': '太白', 'age': 12}}
{'name_list': ['张三', 'LISI', '隔壁王叔叔', '旺旺'], 'dic2': {'hobby': 'girl', 'name': '太白', 'age': 12}}