六,Pyhton之字典,集合 {字典和集合的增删改查,以及综合练习}

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,本章知识简介

二,字典

1,什么是字典?

2,字典的特点

3,字典的创建

3.1,我们可以通过{}、dict()来创建字典对象

3.2,通过zip()创建字典对象

3.3,通过fromkeys创建值为空的字典

4,字典元素的访问

4.1,通过 [键] 获得“值”。若键不存在,则抛出异常。

4.2,通过get方法获取值.如果键不存在,返回None,也可以返回指定值 

4.3,列出所有的键值对

4.4,len() 键值对的个数

4.5,检测一个“键”是否在字典中

5,字典元素添加、修改、删除

5.1,给字典新增“键值对”

5.2,字典的update方法

5.3,字典的删除

5.4,随机删除和返回该键值对

6,字典的序列解包

 7,表格数据使用字典和列表存储和访问

8,字典的核心原理

三,集合

1,集合创建和删除

1.1,使用{}创建集合对象,并使用add()方法添加元素

1.2 使用set()

1.3,remove()删除指定元素;clear()清空整个集合

2,集合相关操作

四,序列综合测试

1,python中,关于序列(容器)的简述?

2,如何创建列表[10,20,30,40,50,60,70,80,90] ?

3,如何在在列表[10,20,30]后添加元素40?

4,如何删除 a = [10,20,30,40,50] 最后一个元素50?

5,如何判断 a = [10,20,30,40,50,20,30,20,30] 是否包含元素 20?

6,如下代码[10,20,30,40][1:3] ,执行结果的是

7,如下代码[10,20,30,40,50,60,70][::-1],执行结果的是

8,画出代码 a = [100,200,300] 的内存存储示意图

9,使用 range 生成序列: [30,40,50,60,70,80] {30,40,50,60,70,80}

10,推导式生成列表: a = [x*2 for x in range(100) if x%9==0] ,手写出结果

11,元组和列表有哪些共同点?有哪些不同点?

12,创建一个字典对象,包含如下信息: 支出金额:300.15,支出日期:2018.10.18,支出人:小七

13,集合和字典有什么关系?

14,生成验证码案例

15,请问:字符串只能与字符串内容拼接,这句话正确吗?

16,请问:修改和添加字典元素时,都可以采用【变量名[键] = 值】,这句话对吗?

17,当直接给变量内容定义为{ }时,表示是?

18,当通过键访问字典的值出错时,可以考虑使用?

19,字典的内部元素形式是键值对,且键是唯一的,这句话正确吗

20,元组的内容可以查询,但不能添加、不能删除、也不能修改,这句话正确吗?

21,如果要判断列表中是否存在某元素值,可以使用什么 关键字?

22,如果要修改列表的元素,可以通过索引值来操作,这句话正确吗?

23,当要给列表添加元素时,首先应该想到方法?

24,如果要在for循环中获取列表的索引值,可以引入一个计数器,这句话正确吗?

25,如果要定义一个列表变量,可以使用什么符号?

26,当要查找字符串的某元素时,可以使用?

27,切片操作适用于所有序列的操作,比如对字符串、列表、元组等,这句话正确吗?

28,实操,6班的学生有:张三、李四、王五、钱六,从键盘上录入一个学生姓名,检验是否是6班的学生。若是6班的学生,就输出:6班学生,欢迎你;否则,输出:非6班学生,非诚勿扰。

29,定义一个列表,用于存放手机品牌信息,例如小米、华为、OPPO、苹果、荣耀等,要求:

30,请使用字典类型来表示一台电脑的信息,例如有电脑品牌、价格、电脑屏幕尺寸、系统版本等,并单独获取品牌值、价格值。并给电脑信息字典做如下操作:


一,本章知识简介

主线A:字典

主线B:集合

回顾前面知识

pyhthon学习路线:

  • 前置:
    • pyhton的概述
    • pyhton环境安装;
  • 基础:
    • 注释
    • 标识符
    • 关键字
    • 变量
    • 数据类型
    • 输入
    • 输出
    • 运算符
  • 控制语句
    • 选择分支 
    • 循环结构
  • 序列(容器)
    • 字符串
    • 列表
    • 元组

一,邂逅Python,搭建python环境,基础语法介绍:python注释,关键字,标识符,变量,数据类型,print()输出,input()输入,数据类型转换等-CSDN博客

二,PyCharm软件的使用,Python运算符,变量的介绍与运用,以及本章综合测试-CSDN博客

三,python控制语句 (条件分支与循环结构)-CSDN博客

四,python之字符串. [字符串的特点,操作,常用方法,遍历,综合测试]-CSDN博客

五,Python之列表与元组 [列表和元组的特点,操作,常用方法,遍历]-CSDN博客


二,字典

1,什么是字典?

先来看看现实生活中的字典。我们知道,可以应用字典来查找汉字。

接着,来看看Python中的字典。比如,定义一个本书:

{"name":"新华字典","page":568,"price":46.5}

仔细观察,会发现Python字典需要使用{ }引起来,且元素形式为键值对。

键值对,可以理解为一一对应的关系,即可以通过键找到值。

字典是 键值对 的无序可变序列,字典中的每个元素都是一个 键值对” ,包含: 键对象 值对象 。可以通过 键对象 实现快速获取、删除、更新对应的“ 值对象
列表中我们通过 下标数字 找到对应的对象。字典中通过 键对象 找到对应的“ 值对象

2,字典的特点

1 “键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。
2  但是:列表、字典、集合这些可变对象,不能作为“键”。
3   并且“键”不可重复。
4 “值”可以是任意的数据,并且可重复

5 键、值组合在一起,形成了字典的元素;

6 字典元素的键是唯一的;

7 可以使用字典存储大量数据。

3,字典的创建

语法:

变量名 = {键1: 值1, 键2: 值2, ...}

3.1,我们可以通过{}dict()来创建字典对象

dict1 = {}
print(type(dict1))  #<class 'dict'>

dict2= dict()
print(type(dict2)) #<class 'dict'>

3.2,通过zip()创建字典对象

key1=[1,2,3]
value1=['一', '二', '三']
dict3=dict(zip(key1,value1))
print(type(dict3))  #<class 'dict'>

3.3,通过fromkeys创建值为空的字典

dict4=dict.fromkeys(['a','b','c'],1)
print(dict4)  #{'a': 1, 'b': 1, 'c': 1}
print(type(dict4))  #<class 'dict'>

完成:

(1)定义一个字典变量,存放一个学生的信息:姓名、性别、住址、年龄等;

(2)输出并查看字典变量值与类型;

(3)思考1:若给字典变量存放两个性别信息,会怎样?

(4)思考2:若给字典变量再存放一个薪酬,与年龄值相同,会怎样?

# 1.定义字典变量
student = {"name":"欧阳芝","sex":"女","address":"广东广州","age":16}
# 2.查看类型和变量值
# print(type(student))  # <class 'dict'>
# print(student)
# 3.存放两个性别?  sex  键唯一?
# student = {"name":"欧阳芝","sex":"女","address":"广东广州","age":16,"sex":"Female"}
# print(student)   # 键是唯一的,如果有多个相同的键, 最后的键会把前面的键所对应的值都给覆盖了
# 4.value多个
# student = {"name":"欧阳芝","sex":"女","address":"广东广州","age":16,"salary":16}
# print(student)  # 值可以重复

=总结:==

(1)字典与列表类似,都属于可变数据类型,即当添加元素后,长度也跟着变化;

(2)注意:字典的内部元素形式是键值对,且键是唯一的,这句话正确吗?==A、正确==;

4,字典元素的访问

为了测试各种访问方法,我们这里设定一个字典对象:

4.1,通过 [] 获得。若键不存在,则抛出异常。

a={'乔峰':80,'段誉':90,'虚竹':85}
b=a['乔峰']
print(b)  # 80
c=a[80]
print(c)  #报错  键不存在  KeyError: 80

4.2,通过get方法获取值.如果键不存在,返回None,也可以返回指定值 

通过 get() 方法获得 ❤️ 推荐使用。优点是:指定键不存在, 返回None ;也可以设定指定键不存在时默认返回的对象。推荐 使用get() 获取 值对象
a={'乔峰':80,'段誉':90,'虚竹':85}
# b=a['乔峰']
# print(b)  # 80
# c=a[80]
# print(c)  #报错  键不存在  KeyError: 80
print(a.get('虚竹'))
print(a.get('虚竹1',90))  #如果键不存在 则返回第二个参数

4.3,列出所有的键值对

a={'乔峰':80,'段誉':90,'虚竹':85}
print(a.keys()) # dict_keys(['乔峰', '段誉', '虚竹'])
print(a.values())  # dict_values([80, 90, 85])
print(a.items())  # dict_items([('乔峰', 80), ('段誉', 90), ('虚竹', 85)])

4.4,len() 键值对的个数

a={'乔峰':80,'段誉':90,'虚竹':85}
print(len(a)) # 3

4.5,检测一个是否在字典中

a={'乔峰':80,'段誉':90,'虚竹':85}
print(a.keys()) # dict_keys(['乔峰', '段誉', '虚竹'])
print(a.values())  # dict_values([80, 90, 85])
print(a.items())  # dict_items([('乔峰', 80), ('段誉', 90), ('虚竹', 85)])
a={'乔峰':80,'段誉':90,'虚竹':85}
print(len(a)) # 3

print('虚竹' in a)  # True

5,字典元素添加、修改、删除

5.1,给字典新增键值对

a={'乔峰':80,'段誉':90,'虚竹':85}
a['王语嫣']=85  # 添加  如果键不存在 则添加
print(a)  #{'乔峰': 80, '段誉': 90, '虚竹': 85, '王语嫣': 85}
a['乔峰']= 100  #如果键存在 则修改
print(a)  #{'乔峰': 100, '段誉': 90, '虚竹': 85, '王语嫣': 85}

5.2,字典的update方法

使用 update() 将新字典中所有键值对全部添加到旧字典对象上。如果 key 有重复,则直接覆盖
a={'乔峰':80,'段誉':90,'虚竹':85}
b={'乔峰': 120, '段誉': 90, '虚竹': 85, '王语嫣': 85}
a.update(b) # 更新 
print(a)  #{'乔峰': 120, '段誉': 90, '虚竹': 85, '王语嫣': 85}

5.3,字典的删除

字典中元素的删除,可以使用 del() 方法;或者 clear() 删除所有键值对; pop() 删除指定键值对,并返回对应的 值对象

a={'乔峰': 120, '段誉': 90, '虚竹': 85, '王语嫣': 85}
del(a['乔峰'])
print(a) #{'段誉': 90, '虚竹': 85, '王语嫣': 85}

print(a.pop('王语嫣'))   #85 pop删除指定的键值对 并返回对应的值对象
clear(a)
print(a) #{}  直接清空列表

5.4,随机删除和返回该键值对

随机删除和返回该键值对。字典是 无序可变序列 , 因此没有第一个元素、最后一个元素的概念; popitem 弹出随机的项,因为字典并没有" 最后的元素 " 或者其他有关顺序的概念。若
想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)

从 Python 3.7 开始,字典会记住元素的插入顺序,所以在这个版本及之后,popitem()通常会删除并返回字典中的最后一个插入的键值对。但在 Python 3.7 之前,popitem()的删除顺序是不确定的,它可能随机删除并返回任意一个键值对。

 

对于你给出的例子,在 Python 3.7 及以后版本中,看起来像是固定删除最后一个,但这只是因为你的代码中字典的创建和操作顺序导致的,并不是普遍的确定性规则。

 

所以,不能认为popitem()是固定删除最后一个元素

a={'乔峰': 120, '段誉': 90, '虚竹': 85, '王语嫣': 85,'ss':20}
print(a.popitem())  #('ss', 20)
print(a.popitem())  #('王语嫣', 85)
print(a.popitem())  #('虚竹', 85)
print(a)

6,字典的序列解包

序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值。
x,y,z=(20,30,1)
(a,b,c)=(9,8,10)
[m,n,p]=[10,20,30]
序列解包用于字典时,默认是对 进行操作; 如果需要对键值对操作,则需要使用items() ;如果需要对 进行操作,则需要使用values();
a={'name': '张三', 'age': 20,'job': '程序员'}
name,age,job=a.values()
print(name,age,job)  #张三 20 程序员

name,age,job=a.items()
print(name,age,job)  #('name', '张三') ('age', 20) ('job', '程序员')

name,age,job=a
print(name,age,job)  #name age job
z,x,c=a
print(z,x,c)  #name age job

 7,表格数据使用字典和列表存储和访问

r1 = {"name":"一","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"二","age":19,"salary":20000,"city":"上海"}
r3 = {"name":"五","age":20,"salary":10000,"city":"深圳"}
tb = [r1,r2,r3]
#获得第二行的人的薪资
print(tb[1].get("salary"))
#打印表中所有的的薪资
for i in range(len(tb)):  # i -->0,1,2
    print(tb[i].get("salary"))
#打印表的所有数据
for i in range(len(tb)):
    print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))

8,字典的核心原理

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket 。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。
由于,所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket

将一个键值对放进字典的底层过程

一、计算键的哈希值

  1. 当你要将一个键值对放入字典时,Python 首先会计算键的哈希值。哈希值是一个整数,它是根据键的内容通过特定的哈希算法计算得出的。例如,如果键是一个字符串,Python 会使用其内部的哈希算法来计算该字符串的哈希值。
  2. 这个哈希值在后续的操作中用于确定键值对在字典中的存储位置。

二、确定存储位置

  1. 有了哈希值后,Python 会根据字典的大小和哈希值来确定键值对在内存中的存储位置。具体的计算方式通常是将哈希值对字典的大小取模,得到一个索引值。这个索引值指向字典内部的一个存储位置。
  2. 如果该位置为空,那么可以直接将键值对存储在这个位置。

三、处理冲突

  1. 但是,可能会出现不同的键具有相同的哈希值,或者多个键在取模后得到相同的索引值的情况,这被称为冲突。
  2. Python 通常使用开放寻址法或链表法来处理冲突。
    • 开放寻址法:如果发生冲突,Python 会尝试在字典内部的其他位置寻找空闲位置来存储键值对。它会按照一定的顺序(例如线性探测、二次探测等)逐个检查其他位置,直到找到一个空闲位置。
    • 链表法:在每个存储位置上,可以是一个链表或其他数据结构,当发生冲突时,新的键值对会被添加到链表中。

四、存储键值对

  1. 一旦找到合适的存储位置,Python 就会将键值对存储在该位置。
  2. 同时,字典会记录一些额外的信息,如字典的大小、已使用的存储位置数量等,以便在后续的操作中进行管理和调整。

字典在内存中开销巨大,典型的空间换时间。
键查询速度很快
往字典里面添加新键值对可能导致扩容,导致散列表中键的 序变化。因此,不要在遍历字典的同时进行字典的修改
键必须可散列  ---  数字、字符串、元组,都是可散列的
自定义对象需要支持下面三点:
1 支持 hash() 函数
2 支持通过 __eq__() 方法检测相等性
3 若 a==b 为真,则 hash(a)==hash(b) 也为真


三,集合

集合是无序可变,元素不能重复。实际上,集合底层是字典实现, 集合的所有元素都是字典中的“ 键对象 ,因此是不能重复的且唯一的。

1,集合创建和删除

1.1,使用{}创建集合对象,并使用add()方法添加元素

a = {3,5,7}
a.add(9)    #{9, 3, 5, 7}

1.2 使用set()

将列表、元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保留一个

a = ['a','b','c','b']
b = set(a)  #{'b', 'a', 'c'}

1.3,remove()删除指定元素;clear()清空整个集合

a = {10,20,30,40,50}
a.remove(20)   #{10, 50, 40,30}

2,集合相关操作

>>> a = {1,3,'fm'}
>>> b = {'he','it','fm'}
>>> a|b #并集
{1, 3, 'fm', 'he', 'it'}
>>> a&b #交集
{'fm'}
>>> a-b #差集
{1, 3}
>>> a.union(b) #并集
{1, 3, 'fm', 'he', 'it'}
>>> a.intersection(b) #交集
{'fm'}
>>> a.difference(b) #差集
{1, 3}


四,序列综合测试

1,python中,关于序列(容器)的简述?

内存中,序列就是一块用来存放多个值的连续的内存空间

字符串和列表都是序列类型

列表:用于存储任意数目、任意类型的数据集合

2,如何创建列表[10,20,30,40,50,60,70,80,90] ?

a = [10,20,30,40,50,60,70,80,90]

或者

b = [x*10 for x in range(1,10)]

或者

c = [x*10 for x in range(10) if x>0]

3,如何在在列表[10,20,30]后添加元素40?

[10,20,30]+[40]
或者
[10,20,30].append(40)
或者
[10,20,30].insert(2,40)

4,如何删除 a = [10,20,30,40,50] 最后一个元素50?

a.pop()
a.remove(50)
a.pop(4)

5,如何判断 a = [10,20,30,40,50,20,30,20,30] 是否包含元素 20?

20 in a
0<=a.index(20)<=len(a) - 1
a.count(20)==0

6,如下代码[10,20,30,40][1:3] ,执行结果的是

[20, 30]

7,如下代码[10,20,30,40,50,60,70][::-1],执行结果的是

[70, 60, 50, 40, 30, 20, 10]

8,画出代码 a = [100,200,300] 的内存存储示意图

9,使用 range 生成序列: [30,40,50,60,70,80] {30,40,50,60,70,80}

a=[i*10 for i in range(3,9)]
b=(i*10 for i in range(3,9))
print(a)  #[30, 40, 50, 60, 70, 80]
print(set(b))  #{70, 40, 80, 50, 60, 30}

10,推导式生成列表: a = [x*2 for x in range(100) if x%9==0] ,手写出结果

[0*2,9*2,18*2,27*2,36*2,45*2,54*2,63*2,72*2,81*2,90*2,99*2]

[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

11,元组和列表有哪些共同点?有哪些不同点?

相同的:

都是序列类型

都支持切片操作

都可以进行迭代

不同的:

列表是可变类型,元组是不可变类型

列表可以增删改,元组不支持增删改

语法不同 列表是中括号,元组是小括号

12,创建一个字典对象,包含如下信息: 支出金额:300.15,支出日期:2018.10.18,支出人:小七

a={'支出金额':300.15,'支出日期':'2018-10-18','支出人':'小七'}

13,集合和字典有什么关系?

底层数据结构相同,集合和字典的底层都实现了使用哈希表这种数据结构,这使他们在查找元素的时候都非常高效;

唯一性:集合保证其中的元素都是唯一的,字典中的键也是唯一的;从某种意义上来说,他们都可以用来存储不重复的数据

都是使用{}

14,生成验证码案例

1)请生成一个由数字、字母组成的6位数的验证码;

2)文本内容:【XX】验证码2943AD,用于手机验证码登录,5分钟内有效。验证码提供给他人可能导致账号被盗,请勿泄露,谨防被骗。

import random

# 1.先要有批量文本内容 数字、字母
strs = "0123456789ABCDECGHIJKLMNOPQRSTUVWXYZabcdecghijklmnopqrstuvwxyz"
code = ""
# 2.for循环
for temp in range(6):
    # 3.动态获取字母或数字 + 拼接
    index = random.randint(0,len(strs)-1)
    text = strs[index]
    # print(text)
    # 4.生成了验证码
    code += text
# print(code)
message = f"【XX】验证码{code},用于手机验证码登录,5分钟内有效。验证码提供给他人可能导致账号被盗,请勿泄露,谨防被骗。"
print(message)

15,请问:字符串只能与字符串内容拼接,这句话正确吗?

正确

16,请问:修改和添加字典元素时,都可以采用【变量名[键] = 值】,这句话对吗?

正确

17,当直接给变量内容定义为{ }时,表示是?

字典  .集合需要用set()定义

18,当通过键访问字典的值出错时,可以考虑使用?

get(键)

19,字典的内部元素形式是键值对,且键是唯一的,这句话正确吗

正确

20,元组的内容可以查询,但不能添加、不能删除、也不能修改,这句话正确吗?

正确

21,如果要判断列表中是否存在某元素值,可以使用什么 关键字?

in

22,如果要修改列表的元素,可以通过索引值来操作,这句话正确吗?

正确

23,当要给列表添加元素时,首先应该想到方法?

append()

24,如果要在for循环中获取列表的索引值,可以引入一个计数器,这句话正确吗?

正确

25,如果要定义一个列表变量,可以使用什么符号?

[]

26,当要查找字符串的某元素时,可以使用?

find() 或者 index()

27,切片操作适用于所有序列的操作,比如对字符串、列表、元组等,这句话正确吗?

正确

28,实操,6班的学生有:张三、李四、王五、钱六,从键盘上录入一个学生姓名,检验是否是6班的学生。若是6班的学生,就输出:6班学生,欢迎你;否则,输出:非6班学生,非诚勿扰。

# 学生信息
student_lists = ["张三","李四","王五","钱六"]
# input()
name = input("请输入学生姓名:")
# 判断 in
if name in student_lists:
    print(f"6班学生【{name}】,欢迎你.")
else:
    print("非6班学生,非诚勿扰!")

29,定义一个列表,用于存放手机品牌信息,例如小米、华为、OPPO、苹果、荣耀等,要求:

(1)访问元素华为,获取列表总长度;

(2)使用for循环遍历手机品牌列表,并输出所有元素;

(3)使用while循环遍历手机品牌列表,并输出所有元素。

# 定义列表
brand_list = ["小米","华为","OPPO","苹果","荣耀"]

# 查询数据
print(f"访问元素:{brand_list[1]}")
print(f"列表总长度:{len(brand_list)}")
print("-----------------")

# for遍历元素
for brand in brand_list:
    print(f"for遍历的元素:{brand}")
print("-----------------")

# while遍历
index = 0
while index < len(brand_list):
    print(f"while获取元素:{brand_list[index]}")
    index += 1

30,请使用字典类型来表示一台电脑的信息,例如有电脑品牌、价格、电脑屏幕尺寸、系统版本等,并单独获取品牌值、价格值。并给电脑信息字典做如下操作:

(1)查看字典的屏幕尺寸值;

(2)修改价格值为8999;

(3)给字典添加电脑所属类型,如游戏本、或商务本、或轻薄本等;

(4)删除电脑的系统版本元素。

 #电脑信息
computers = {
    "brand":"华硕",
    "price":12899,
    "screensize":15.6,
    "system":"Windows 10",
}
print(f"电脑信息:{computers}")
print("-"*30)

# 查看
print(f"屏幕尺寸:{computers['screensize']}")
print("-"*30)

# 修改价格
computers["price"] = 8999
print(f"修改价格后,电脑信息:{computers}")
print("-"*30)

# 添加元素
computers["kind"] = "商务本"
print(f"添加元素后,电脑信息:{computers}")
print("-"*30)

# 删除元素
del computers["system"]
print(f"删除系统元素后,电脑信息:{computers}")

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值