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}}