Python学习笔记整理(八)

字典

字典这种数据类型在一些数据项目里面比较实用,有一种很火的数据格式就是和字典近乎一样格式:json。

几乎每个网站都会使用 json 来储存一定的数据,从这里面也可以看出一二。对我们数据分析而言,我们往往需要去对一些账号、密码进行核实或者是爬取,那么字典特有的调取值的方式,也为我们提供了极好的思路。

性质

  1. 字典和列表、集合一样,是可以改变的容器型数据类型,这里的改变比较泛指,写完全应该是增删改。
  2. 字典是没有下标的,这一点它和集合一样,所以它也不可以被下标调用,但是现版本的字典是有序的,只是有自己独特的调用方式。
  3. 字典中的元素是以键值对存在的。
  4. 和集合里的元素一样,字典中的键必须是不可变数据类型,但是对值的数据类型不做要求。
  5. 字典的容器符号为 {} ,其元素以逗号分隔,数据类型是 dict 。
  6. 字典不存在拼接和重复。

成员运算

字典的成员运算时判断某个键是否存在于字典中,但并不能判断值是否存在。

给一个具体的例子:

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)
# 通过输出我们可以发现,除非有特殊说明,不然这种常用的操作方式,都是对于字典的键进行操作。

关于取元素的一些方法

  1. keys() 方法

    这个方法用于取得字典中的所有键,并返回一个只有键的容器,是一种只针对字典的键的操作方法,具体使用如下:

    dict1 = {'name': '张三', 'qq': '100001', 'tel': 123}
    print(dict1.keys())
    # dict_keys(['name', 'qq', 'tel'])
    # 这里注意输出出来的结果形似列表,但是实际的数据类型时 dict_keys ,是一种专有的数据类型。
    
  2. values() 方法

    这个方法用于取得字典中所有的值,并返回一个容器,操作和上面类似,直接放代码:

    print(dict1.values())
    # dict_values(['张三', '100001', 123])
    # 这里的容器的数据类型是 dict_values ,也是一种专属于 values() 方法的特殊数据类型。
    
  3. 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'}
    

    从输出结果来看,还是很优秀的,但是在使用的时候,我们需要很注意他的要求,如果不注意,还是存在报错的风险。

以上的每一种方法对应都有特殊的要求,有的需要形似,有的对于内部元素可不可变存在要求,用的时候可以常来翻翻。

元素添加

  1. 第一种方法是直接添加元素,利用我们前面在调用元素的章节学到的知识,直接调用我们想添加的键进行赋值就可以了:

    dict1 = {}
    dict1["name"] = '张三'
    print(dict1)
    # {'name': '张三'}
    

    根据上面成员运算部分我们说过在调用键的时候,Python 会进行一个成员运算,存在这个键则修改值,不存在则直接添加这个键值对。

  2. 第二种方法是使用 setdefault() 方法来添加键值对,该方法对于字典的键先进行一个成员运算,不存在这个键则直接将键值对插入,已经存在该键则不对原字典做任何修改。

    dict1.setdefault('name', '李四')
    dict1.setdefault('age', 66)
    print(dict1)
    # {'name': '张三', 'age': 66}
    

    上面的例子可以很好的验证我们提出的该方法的运算逻辑:先对 ‘name’ 进行成员运算,算出 ‘name’ 在字典中存在这个键,那么就终止运算,不对这个键赋值;对 ‘age’ 做成员运算,不存在这个键,则将键值对 'age':66 添加到字典中。

字典更新

字典是可变的数据类型,可以随时更新内部的数据,可以利用更新的方法对于字典进行多个键值对的添加。

字典的更新是特殊方法 update() 的功能,update更新字典有三种类型,分别是,直接传入字典、通过关键字传入、通过传入一个包含一个或多个二元组的列表的方式,下面就对每个方法进行单独讲解。

  1. 传入一个字典

    dict1.update({'address': '地球村', 'sex': '男'})
    print(dict1)
    # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男'}
    

    在这个方法中,我们直接将字典传入,原字典会将传入的字典的每一个键值对传入字典,从而实现字典的更新,但是这里需要注意,如果传入的字典中有相同的键,则会直接覆盖原键值对,修改为新的键值对。

  2. 传入关键字

    dict1.update(english=66)
    print(dict1)
    # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男', 'english': 66}
    

    这里传入关键字的格式为:key = value ,插入的时候,前面是键,后面是值,直接将这个格式插入原字典,实现与上面一样的效果。

  3. 传入一个包含一个或者多个二元组的列表

    这种方法可以理解为先默认使用 dict() 方法将列表转换为对应格式的字典,然后将列表使用 update() 的第一种方式进行传入一个字典来更新元素。

    dict1.update([('math', 0), ('chinese', 100)])
    print(dict1)
    # {'name': '张三', 'age': 66, 'address': '地球村', 'sex': '男', 'english': 66, 'math': 0, 'chinese': 100}
    

元素删除

  1. del[] 操作

    del 指定到字典中的键删除即可,需要注意,当字典中不存在想要删除的这个键的时候,会产生报错。这里中括号里面的是键,填好后,即可实现对于指定键值对的删除。

    del dict1['sex']
    print(dict1)
    # {'name': '法外狂徒张三', 'age': 10, 'address': '地球村', 'english': 66, 'math': 0, 'chinese': 100}
    
  2. 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)
# {}

字典的内容就此结束了,方法其实不是太多,但是比较重要,实用性很广,建议常来看看,有问题及时解。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员好费脑子啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值