字典
字典这种数据类型在一些数据项目里面比较实用,有一种很火的数据格式就是和字典近乎一样格式:json。
几乎每个网站都会使用 json 来储存一定的数据,从这里面也可以看出一二。对我们数据分析而言,我们往往需要去对一些账号、密码进行核实或者是爬取,那么字典特有的调取值的方式,也为我们提供了极好的思路。
性质
- 字典和列表、集合一样,是可以改变的容器型数据类型,这里的改变比较泛指,写完全应该是增删改。
- 字典是没有下标的,这一点它和集合一样,所以它也不可以被下标调用,但是现版本的字典是有序的,只是有自己独特的调用方式。
- 字典中的元素是以键值对存在的。
- 和集合里的元素一样,字典中的键必须是不可变数据类型,但是对值的数据类型不做要求。
- 字典的容器符号为 {} ,其元素以逗号分隔,数据类型是 dict 。
- 字典不存在拼接和重复。
成员运算
字典的成员运算时判断某个键是否存在于字典中,但并不能判断值是否存在。
给一个具体的例子:
stu4 = {'name': '小赖', 'age': 20, 'address': '地球村', 'english': 70, 'math': 80}
print('name' in stu4)
print(20 not in stu4)
有一个小tips:
我们改变字典的键的值的时候,字典会自动进行成员运算,如果内部没有这个键,会自动创建,并以我们给他赋的值直接将这个键值对插入到字典中。
循环遍历
这里字典的循环遍历和的方式与列表、集合以及字符串一样,就是通过元素直接拿到:
for i in stu4:
print(i)
# 通过输出我们可以发现,除非有特殊说明,不然这种常用的操作方式,都是对于字典的键进行操作。
关于取元素的一些方法
-
keys() 方法
这个方法用于取得字典中的所有键,并返回一个只有键的容器,是一种只针对字典的键的操作方法,具体使用如下:
dict1 = {'name': '张三', 'qq': '100001', 'tel': 123} print(dict1.keys()) # dict_keys(['name', 'qq', 'tel']) # 这里注意输出出来的结果形似列表,但是实际的数据类型时 dict_keys ,是一种专有的数据类型。
-
values() 方法
这个方法用于取得字典中所有的值,并返回一个容器,操作和上面类似,直接放代码:
print(dict1.values()) # dict_values(['张三', '100001', 123]) # 这里的容器的数据类型是 dict_values ,也是一种专属于 values() 方法的特殊数据类型。
-
items() 方法
该方法用于将字典中的整个键值对从字典中取出,返回一个特殊容器,代码如下:
print(dict1.items()) # dict_items([('name', '张三'), ('qq', '100001'), ('tel', 123)])
上面的三种方法都是对应取出我们在字典中想要的数据,可以是键,可以是值,也可能是键值对,总体来说,还是好用的,如果涉及到字典的题目,需要熟记。
sum、max、min、sorted、len等方法,都可以作用于字典,但是操作对象都是字典中的键(key)
字典转类型
这个小章节是我单独去加的,因为我在学习字典寻找例题的时候,明显就感觉到,很多涉及到账号、密码的题目,如果使用列表也能做,但是分开的两个列表一来占用内存不说,进行两个列表嵌套的成员运算的时候还极容易造成时间复杂度冗余,程序超时,所以,我们直接使用字典,会大大减少这个问题。
所以,我们在这里提供几种 python 中字典转类型以及其他类型数据转字典的方式,可以供大家参考。
-
eval() 函数
这个函数的用法是拿来直接执行字符串内的函数,是一个反字符串的操作,所以我们可以用来对于和字典相同格式的字符串进行转格式,下面给出例子:
list1 = '{"dad":2}' print(eval(list1)) # {'dad': 2}
如上就是很简单的对于形似字典的字符串进行转格式。
但是这里是存在隐患的,eval() 函数可以直接将字符串里的指令执行,虽然对于我们来说,只是使用将字符串转为字典,但是对于有心人来说,可以在字符串的引号内嵌入一些恶意指令,从而将代码变成恶意程序,就有可能毁坏电脑,所以要慎用eval()!!!
再提一句,抖音的评论区里无法输入一些特殊字符,比如 <> 这一类的,也是为了防止有人在评论区插入恶意代码。
那么为了防止有人插入恶意代码,还是推荐使用 eval 的变式。
-
literal_eval() 方法
import ast list1='{"dad":2}' list2 = ast.literal_eval(list1) print(list2) # {'dad': 2}
从使用上,这两个方法的效果完全一样,后者还可以防止恶意代码的嵌入,更好一些。
-
json 包的特殊方法
.json 是一种特殊的数据后缀,一般也是拿来存数据的,我们可以利用包里的方法,将形似字典的字符串进行转格式:
import json list1 = '{"dad": 2}' print(type(json.loads(list1))) print(type(json.dumps(list1))) # <class 'dict'> # <class 'str'>
loads() 方法是将形似字典的字符串转为字典,dunps() 方法则是反过来将字典转为字符串,我们使用的时候只需要调用 json 包并使用这两个函数就可以实现转换。
-
dict() 方法
这个方法较于上两种方法算是一种特殊方法,因为它不只是简单的转格式,而是一种运算,它可以将容器中的多个容器的内的两个元素进行转为字典,第一个元素为键,第二个为值。而这种方法就存在一些必然的要求:
a.数据本身是容器。
b.容器中的元素还必须是一个容器,必须是列表、集合之类的容器型数据类型。
c.容器中的容器必须只有两个元素。
d.这两个元素的第一个元素必须是不可变数据类型(这里对应前面字典对于键的要求)。综上,可以知道, dict() 方法是将其内部的容器型数据转为字典,要求非常高,给一个例子给大家:
list1 = [[1, 2], ('name', '张三'), 'ab'] print(dict(list1)) # {1: 2, 'name': '张三', 'a': 'b'}
从输出结果来看,还是很优秀的,但是在使用的时候,我们需要很注意他的要求,如果不注意,还是存在报错的风险。
以上的每一种方法对应都有特殊的要求,有的需要形似,有的对于内部元素可不可变存在要求,用的时候可以常来翻翻。
元素添加
-
第一种方法是直接添加元素,利用我们前面在调用元素的章节学到的知识,直接调用我们想添加的键进行赋值就可以了:
dict1 = {} dict1["name"] = '张三' print(dict1) # {'name': '张三'}
根据上面成员运算部分我们说过在调用键的时候,Python 会进行一个成员运算,存在这个键则修改值,不存在则直接添加这个键值对。
-
第二种方法是使用 setdefault() 方法来添加键值对,该方法对于字典的键先进行一个成员运算,不存在这个键则直接将键值对插入,已经存在该键则不对原字典做任何修改。
dict1.setdefault('name', '李四') dict1.setdefault('age', 66) print(dict1) # {'name': '张三', 'age': 66}
上面的例子可以很好的验证我们提出的该方法的运算逻辑:先对 ‘name’ 进行成员运算,算出 ‘name’ 在字典中存在这个键,那么就终止运算,不对这个键赋值;对 ‘age’ 做成员运算,不存在这个键,则将键值对
'age':66
添加到字典中。
字典更新
字典是可变的数据类型,可以随时更新内部的数据,可以利用更新的方法对于字典进行多个键值对的添加。
字典的更新是特殊方法 update() 的功能,update更新字典有三种类型,分别是,直接传入字典、通过关键字传入、通过传入一个包含一个或多个二元组的列表的方式,下面就对每个方法进行单独讲解。
-
传入一个字典
dict1.update({'address': '地球村', 'sex': '男'}) print(dict1) # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男'}
在这个方法中,我们直接将字典传入,原字典会将传入的字典的每一个键值对传入字典,从而实现字典的更新,但是这里需要注意,如果传入的字典中有相同的键,则会直接覆盖原键值对,修改为新的键值对。
-
传入关键字
dict1.update(english=66) print(dict1) # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男', 'english': 66}
这里传入关键字的格式为:key = value ,插入的时候,前面是键,后面是值,直接将这个格式插入原字典,实现与上面一样的效果。
-
传入一个包含一个或者多个二元组的列表
这种方法可以理解为先默认使用 dict() 方法将列表转换为对应格式的字典,然后将列表使用 update() 的第一种方式进行传入一个字典来更新元素。
dict1.update([('math', 0), ('chinese', 100)]) print(dict1) # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男', 'english': 66, 'math': 0, 'chinese': 100}
元素删除
-
del[] 操作
del 指定到字典中的键删除即可,需要注意,当字典中不存在想要删除的这个键的时候,会产生报错。这里中括号里面的是键,填好后,即可实现对于指定键值对的删除。
del dict1['sex'] print(dict1) # {'name': '法外狂徒张三', 'age': 10, 'address': '地球村', 'english': 66, 'math': 0, 'chinese': 100}
-
pop() 操作
语法为 字典.pop(键) ,这里的 pop 可以返回相应的删除的键,如果这个键不在字典中,这个程序不会报错,同样的,也没有返回值。
result = dict1.pop('english') print(result) print(dict1) # {'name': '法外狂徒张三', 'age': 10, 'address': '地球村', 'math': 0, 'chinese': 100}
清空字典
clear() 方法
直接对字典使用就可以将字典清空,但是这种方法和清空元组的 del 不一样,后者可以直接将变量也清除了,前者只能清空字典内所有的键值对,将字典变为一个空字典。
dict1.clear()
print(dict1)
# {}
字典的内容就此结束了,方法其实不是太多,但是比较重要,实用性很广,建议常来看看,有问题及时解。