day06 数据类型(下)
常见的数据类型:
- int,整数类型(整型)
- bool,布尔类型
- str,字符串类型
- list,列表类型
- tuple,元组类型
- dict,字典类型
- set,集合类型
- float,浮点类型(浮点型)
目标:掌握字典、集合、浮点类型相关知识。
课程概要:
- set集合:一个不允许重复重复 & 可变类型(元素可哈希)。
- dict字典:一个储存键值对的容器。
- float类型:我们生活中常见的小数。
1.集合(set)
集合是一个无序 、可变、不允许数据重复的容器。
1.1 定义
v1 = {
11, 22, 33, "alex" }
-
无序,无法通过索引取值。
-
可变,可以添加和删除元素。
v1 = { 11,22,33,44} v1.add(55) print(v1) # 输出结果:{11,22,33,44,55}
-
不允许数据重复。
v1 = { 11,22,33,44} v1.add(22) print(v1) # 输出结果:{11,22,33,44}
一般什么时候用集合呢?
一般想要维护一大堆不重复的数据时,就可以使用集合。比如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储链接地址。
注意:定义空集合时,只能使用v = set()
,不能使用 v={}
。
# 定义一个空列表:
v1 = []
v11 = list()
# 定义一个空元组:
v2 = ()
v22 = tuple()
# 定义一个空集合:
v3 = set()
# 定义一个空字典:
v4 = {
}
v44 = dict()
1.2 独有功能
1.2.1 add() 添加元素
data = {
"刘嘉玲", '关之琳', "王祖贤"}
data.add("郑裕玲")
print(data)
# 输出结果:
{
"刘嘉玲", '关之琳', "王祖贤","郑裕玲"}
data = set()
data.add("周杰伦")
data.add("林俊杰")
print(data)
# 输出结果:
{
"周杰伦","林俊杰"}
1.2.2 discard() 删除元素
data = {
"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
data.discard("关之琳")
print(data)
# 输出结果:
{
"刘嘉玲", "王祖贤","张曼⽟", "李若彤"}
1.2.3 intersection() 或 &:交集
s1 = {
"刘能", "赵四", "⽪⻓⼭"}
s2 = {
"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1.intersection(s2)
print(s3)
s4 = s1 & s2
print(s4)
# 输出结果:{"⽪⻓⼭"}
1.2.4 unio() 或 | :并集
s1 = {
"刘能", "赵四", "⽪⻓⼭"}
s2 = {
"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1.union(s2)
print(s3)
s4 = s1 | s2
print(s4)
# 输出结果:{"刘能", "赵四", "⽪⻓⼭","刘科⻓", "冯乡⻓"}
1.2.5 difference() 或 - :差集
s1 = {
"刘能", "赵四", "⽪⻓⼭"}
s2 = {
"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1.difference(s2) # s1中有且s2中没有的值
s4 = s1 - s2 # s1中有且s2中没有的值
print(s3)
# 输出结果:{"刘能", "赵四"}
s5 = s2.difference(s1) # s2中有且s1中没有的值
s6 = s2 - s1 # s2中有且s1中没有的值
print(s5)
# 输出结果:{"刘科⻓", "冯乡⻓"}
1.3 公共功能
-
长度
v = { "刘能", "赵四", "尼古拉斯"} data = len(v) print(data) # 输出结果:3
-
for循环
v = { "刘能", "赵四", "尼古拉斯"} for item in v: print(item) # 输出结果: "刘能" "赵四" "尼古拉斯"
1.4 转换
其他类型转换为集合类型,可以通过set()实现,并且如果有重复的数据会在转换成集合时自动去重。
提示:str / list / tuple / dict 都可以转换为集合。
v1 = "轩小陌"
v2 = set(v1)
print(v2)
# 输出结果:{"轩","小","陌"}
v1 = [11,22,33,11,3,99,22]
v2 = set(v1)
print(v2)
# 输出结果:{11,22,33,3,99}
注意:为字符串、列表、元组中的元素去重,是集合日常使用过程中的一个主要功能。
1.5 其他
1.5.1 集合的存储原理
1.5.2 集合中的元素必须可哈希
因存储原理,集合的元素必须是可哈希的值,即:内部可通过哈希函数把元素转换成一个数值。
注意:目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。因此,集合的元素只能是 int、bool、str、tuple 。
-
转换成功
v1 = [11,22,33,11,3,99,22] v2 = set(v1) print(v2) # 输出结果:{11,22,33,3,99}
-
转换失败
v1 = [11,22,["alex","eric"],33] v2 = set(v1) print(v2) # 报错
1.5.3 查找效率高
因存储原理的特殊性,集合相比列表和元组,查找效率非常高。
-
效率低
user_list = ["轩小陌","alex","李璐"] if "alex" in user_list: print("在") else: print("不在") user_tuple = ("轩小陌","alex","李璐") if "alex" in user_tuple: print("在") else: print("不在")
-
效率高
user_set = { "轩小陌","alex","李璐"} if "alex" in user_set: print("在") else: print("不在")
1.5.4 列表、元组、集合的对比和嵌套
类型 | 是否可变 | 是否有序 | 元素要求 | 是否可哈希 | 转换 | 定义空 |
---|---|---|---|---|---|---|
list | 是 | 是 | 无 | 否 | list(其他) | v=[]或v=list() |
tuple | 否 | 是 | 无 | 是 | tuple(其他) | v=()或v=tuple() |
set | 是 | 否 | 可哈希 | 否 | set(其他) | v=set() |
data_list = [
"alex",
11,
(11, 22, 33, {
"alex", "eric"}, 22),
[11, 22, 33, 22],
{
11, 22, (True, ["中国", "北京"], "沙河"), 33}
]
# 通过以上示例可看出:列表中可嵌套元组和集合,元组中可嵌套列表和集合,但集合中只能嵌套元组
注意:由于True和False本质上存储的是 1 和 0 ,而集合又不允许重复,所以在整型 0、1和False、True在集合中同时出现会自动被去重:
v1 = {
True, 1}
print(v1) # 输出结果:{True}
v3 = {
0, False}
print(v3) # 输出结果:{0}
练习题
-
写代码实现
v1 = { 'alex','轩sir','肖大'} v2 = [] # 循环提示用户输入,如果输入值在v1中存在,则追加到v2中,如果v1中不存在,则添加到v1中。(如果输入N或n则停止循环) while True: name = input("请输入姓名(N/n退出):") if name.upper() == "N": break if name in v1: v2.append(name) else: v1.add(name)
-
下面那些值不能做集合的元素
"" # 能 0 # 能 [11,22,33] #