9.基本数据类型详细讲解-set/dict/float
Python的基本数据类型有以下几个类型,在我们实际中常用到的也是这几种类型,下面会跟大家介绍一下
- 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 独有功能
添加元素
data = {"刘嘉玲", '关之琳', "王祖贤"} data.add("郑裕玲") print(data)
data = set() data.add("周杰伦") data.add("林俊杰") print(data)
删除元素
data = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"} data.discard("关之琳") print(data)
交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}s4 = s1.intersection(s2) # 取两个集合的交集 print(s4) # {"⽪⻓⼭"}s3 = s1 & s2 # 取两个集合的交集 print(s3)
并集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.union(s2) # 取两个集合的并集 {"刘能", "赵四", "⽪⻓⼭","刘科⻓", "冯乡⻓", } print(s4) s3 = s1 | s2 # 取两个集合的并集 print(s3)
差集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {"刘能", "赵四"} s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {"刘科⻓", "冯乡⻓"}s3 = s1 - s2 # 差集,s1中有且s2中没有的值 s5 = s2 - s1 # 差集,s2中有且s1中没有的值print(s5,s6)
1.3 公共功能
减,计算差集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}s3 = s1 - s2 s4 = s2 - s1 print(s3) print(s4)
&,计算交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 & s2 print(s3)
|,计算并集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 | s2 print(s3)
长度
v = {"刘能", "赵四", "尼古拉斯"} data = len(v) print(data)
for循环
v = {"刘能", "赵四", "尼古拉斯"} for item in v:print(item)
1.4 转换
其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。
提示:int/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}
v1 = (11,22,3,11)
v2 = set(v1)
print(v2) # {11,22,3}
提示:这其实也是去重的一个手段。
data = {11,22,33,3,99}v1 = list(data) # [11,22,33,3,99]v2 = tuple(data) # (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}v2 = {1, True}
print(v2) # {1}v3 = {0, False}
print(v3) # {0}v4 = {False, 0}
print(v4) # {False}
None类型
Python的数据类型中有一个特殊的值None,意味着这个值啥都不是 或 表示空。 相当于其他语言中 null
作用一样。
在一定程度上可以帮助我们去节省内存。例如:
v1 = None
v2 = None
..
v1 = [11,22,33,44]
v2 = [111,22,43]
v3 = []
v4 = []
...
v3 = [11,22,33,44]
v4 = [111,22,43]
注意:暂不要考虑Python内部的缓存和驻留机制。
目前所有转换为布尔值为False的值有:
0
""
[] or list()
() or tuple()
set()
None
if None:pass
2.字典(dict)
字典是 无序、键不重复 且 元素只能是键值对的可变的 个 容器。
data = { "k1":1, "k2":2 }
容器
元素必须键值对
键不重复,重复则会被覆盖
data = { "k1":1, "k1":2 } print(data) # {"k1":2}
无序(在Python3.6+字典就是有序了,之前的字典都是无序。)
data = { "k1":1, "k2":2 } print(data)
2.1 定义
v1 = {}
v2 = dict()
data = { "k1":1, "k2":2
}
info = { "age":12, "status":True, "name":"wupeiqi", "hobby":['篮球','足球']
}
字典中对键值得要求:
- 键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。(集合)
- 值:任意类型。
data_dict = {"武沛齐":29,True:5,123:5,(11,22,33):["alex","eric"]
}
# 不合法
v1 = {[1, 2, 3]: '周杰伦',"age" : 18
}
v2 = {{1,2,3}: "哈哈哈",'name':"alex"
} v3 = {{"k1":123,"k2":456}: '呵呵呵',"age":999
}
data_dict = {1: 29,True: 5
}
print(data_dict) # {1: 5}
一般在什么情况下会用到字典呢?
当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
# 用户列表
user_list = [ ("alex","123"), ("admin","666") ]
...
# 用户列表
user_list = [ {"name":"alex","pwd":"123"}, {"name":"eric","pwd":"123"} ]
2.2 独有功能
获取值
info = { "age":12, "status":True, "name":"武沛齐","data":None }data1 = info.get("name") print(data1) # 输出:武沛齐data2 = info.get("age") print(data2) # 输出:12data = info.get("email") # 键不存在,默认返回 None """ if data == None:print("此键不存在") else:print(data)if data:print(data) else:print("键不存在") """""" # 字典的键中是否存在 email if "email" in info:data = info.get("email")print(data) else:print("不存在") """data = info.get("hobby",123) print(data) # 输出:123
# 案例: user_list = {"wupeiqi": "123","alex": "uk87", }username = input("请输入用户名:") password = input("请输入密码:") # None,用户名不存在 # 密码,接下来比较密码 pwd = user_list.get(username)if pwd == None:print("用户名不存在") else:if password == pwd:print("登录成功")else:print("密码错误")
# 案例: user_list = {"wupeiqi": "123","alex": "uk87", }username = input("请输入用户名:") password = input("请输入密码:") # None,用户名不存在 # 密码,接下来比较密码 pwd = user_list.get(username)if pwd:if password == pwd:print("登录成功")else:print("密码错误") else:print("用户名不存在")
# 案例: user_list = {"wupeiqi": "123","alex": "uk87", }username = input("请输入用户名:") password = input("请输入密码:") # None,用户名不存在 # 密码,接下来比较密码 pwd = user_list.get(username)if not pwd:print("用户名不存在") else:if password == pwd:print("登录成功")else:print("密码错误")# 写代码的准则:简单的逻辑处理放在前面;复杂的逻辑放在后面。
所有的键
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} data = info.keys() print(data) # 输出:dict_keys(['age', 'status', 'name', 'email']) py2 -> ['age', 'status', 'name', 'email']result = list(data) print(result) # ['age', 'status', 'name', 'email']
注意:在Python2中 字典.keys()直接获取到的是列表,而Python3中返回的是
高仿列表
,这个高仿的列表可以被循环显示。# 循环 info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} for ele in info.keys():print(ele)
# 是否存在 info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} # info.keys() # dict_keys(['age', 'status', 'name', 'email']) if "age" in info.keys():print("age是字典的键") else:print("age不是")
所有的值
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} data = info.values()print(data) # 输出:dict_values([12, True, 'wupeiqi', 'xx@live.com'])
注意:在Python2中 字典.values()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。
# 循环 info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} for val in info.values():print(val)
# 是否存在 info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} if 12 in info.values():print("12是字典的值") else:print("12不是")
所有的键值
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} data = info.items()print(data) # 输出 dict_items([ ('age', 12), ('status', True), ('name', 'wupeiqi'), ('email', 'xx@live.com') ])
for item in info.items():print(item[0],item[1]) # item是一个元组 (键,值)
for key,value in info.items():print(key,value) # key代表键,value代表值,将兼职从元组中直接拆分出来了。
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} data = info.items()if ('age', 12) in data:print("在") else:print("不在")
设置值
data = {"name": "武沛齐","email": 'xxx@live.com' } data.setdefault("age", 18) print(data) # {'name': '武沛齐', 'email': 'xxx@live.com', 'age': 18}data.setdefault("name", "alex") print(data) # {'name': '武沛齐', 'email': 'xxx@live.com', 'age': 18}
更新字典键值对
info = {"age":12, "status":True} info.update( {"age":14,"name":"武沛齐"} ) # info中没有的键直接添加;有的键则更新值 print(info) # 输出:{"age":14, "status":True,"name":"武沛齐"}
移除指定键值对
info = {"age":12, "status":True,"name":"武沛齐"}data = info.pop("age")print(info) # {"status":True,"name":"武沛齐"} print(data) # 12
按照顺序移除(后进先出)
info = {"age":12, "status":True,"name":"武沛齐"} data = info.popitem() # ("name","武沛齐" )print(info) # {"age":12, "status":True} print(data) # ("name","武沛齐")
- py3.6后,popitem移除最后的值。
- py3.6之前,popitem随机删除。
# 练习题
"""
结合下面的两个变量 header 和 stock_dict实现注意输出股票信息,格式如下:SH601778,股票名称:中国晶科、当前价:6.29、涨跌额:+1.92。SH688566,股票名称:吉贝尔、当前价:... 。...
"""
header = ['股票名称', '当前价', '涨跌额']stock_dict = {'SH601778': ['中国晶科', '6.29', '+1.92'], 'SH688566': ['吉贝尔', '52.66', '+6.96'], 'SH688268': ['华特气体', '88.80', '+11.72'], 'SH600734': ['实达集团', '2.60', '+0.24']
}
2.3 公共功能
求
并集
(Python3.9新加入)v1 = {"k1": 1, "k2": 2} v2 = {"k2": 22, "k3": 33}v3 = v1 | v2 print(v3) # {'k1': 1, 'k2': 22, 'k3': 33}
长度
info = {"age":12, "status":True,"name":"武沛齐"} data = len(info) print(data) # 输出:3
是否包含
info = { "age":12, "status":True,"name":"武沛齐" } v1 = "age" in info print(v1)v2 = "age" in info.keys() print(v2)if "age" in info:pass else:pass
info = {"age":12, "status":True,"name":"武沛齐"} v1 = "武佩奇" in info.values() print(v1)
info = {"age": 12, "status": True, "name": "武沛齐"} # 输出info.items()获取到的 dict_items([ ('age', 12), ('status', True), ('name', 'wupeiqi'), ('email', 'xx@live.com') ]) v1 = ("age", 12) in info.items() print(v1)
索引(键)
字典不同于元组和列表,字典的索引是键
,而列表和元组则是0、1、2等数值
。info = { "age":12, "status":True, "name":"武沛齐"}print( info["age"] ) # 输出:12 print( info["name"] ) # 输出:武沛齐 print( info["status"] ) # 输出:True print( info["xxxx"] ) # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值)value = info.get("xxxxx") # None print(value)
根据键 修改值 和 添加值 和 删除键值对
上述示例通过键可以找到字典中的值,通过键也可以对字典进行添加和更新操作info = {"age":12, "status":True,"name":"武沛齐"}info["gender"] = "男"print(info) # 输出: {"age":12, "status":True,"name":"武沛齐","gender":"男"}
info = {"age":12, "status":True,"name":"武沛齐"}info["age"] = "18" print(info) # 输出: {"age":"18", "status":True,"name":"武沛齐"}
info = {"age":12, "status":True,"name":"武沛齐"} del info["age"] # 删除info字典中键为age的那个键值对(键不存在则报错)print(info) # 输出: {"status":True,"name":"武沛齐"}
info = {"age": 12, "status": True, "name": "武沛齐"} if "agea" in info:# del info["age"]data = info.pop("age")print(info)print(data) else:print("键不存在")
for循环
由于字典也属于是容器,内部可以包含多个键值对,可以通过循环对其中的:键、值、键值进行循环;info = {"age":12, "status":True,"name":"武沛齐"} for item in info:print(item) # 所有键
info = {"age":12, "status":True,"name":"武沛齐"} for item in info.key():print(item)
info = {"age":12, "status":True,"name":"武沛齐"} for item in info.values():print(item)
info = {"age":12, "status":True,"name":"武沛齐"} for key,value in info.items():print(key,value)
2.4 转换
想要转换为字典.
v = dict( [ ("k1", "v1"), ["k2", "v2"] ] )print(v) # { "k1":"v1", "k2":"v2" }
info = { "age":12, "status":True, "name":"武沛齐" }v1 = list(info) # ["age","status","name"]v2 = list(info.keys()) # ["age","status","name"]v3 = list(info.values()) # [12,True,"武沛齐"]v4 = list(info.items()) # [ ("age",12), ("status",True), ("name","武沛齐") ]
1.5 其他
1.5.1 存储原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdJw65rm-1654614506721)(assets/image-20201121131221807.png)]
1.5.2 速度快
info = {"alex":["肝胆","铁锤"], "老男孩":["二蛋","缺货"]
}
for "alex" in info:print("在")
info = {"alex":["肝胆","铁锤"], "老男孩":["二蛋","缺货"]
}
v1 = info["alex"]
v2 = info.get("alex")
1.5.3 嵌套
我们已学了很多数据类型,在涉及多种数据类型之间的嵌套时,需注意一下几点:
字典的键必须可哈希(list/set/dict不可哈希)。
info = {(11,22):123 }# 错误 info = {(11,[11,22,],22):"alex" }
字典的值可以是任意类型。
info = {"k1":{12,3,5},"k2":{"xx":"x1"} }
字典的键和集合的元素在遇到 布尔值 和 1、0 时,需注意重复的情况。
元组的元素不可以被替换。
dic = {'name':'汪峰','age':48,'wife':[ {'name':'国际章','age':38},{'name':'李杰','age':48} ],'children':['第一个娃','第二个娃']
}
"""
1. 获取汪峰的妻子名字d1 = dic['wife'][0]['name']print(d1)
2. 获取汪峰的孩子们d2 = dic['children']print(d2)
3. 获取汪峰的第一个孩子d3 = dic['children'][0]print(d3)
4. 汪峰的媳妇姓名变更为 章子怡dic['wife'][0]['name] = "章子怡"print(dic)
5. 汪峰再娶一任妻子dic['wife'].append( {"name":"铁锤","age":19} )print(dic)6. 给汪峰添加一个爱好:吹牛逼dic['hobby'] = "吹牛逼"print(dic)
7. 删除汪峰的年龄del dic['age']或dic.pop('age')print(dic)
"""
3.浮点型(float)
浮点型,一般在开发中用于表示小数。
v1 = 3.14
v2 = 9.89
关于浮点型的其他知识点如下:
在类型转换时需要,在浮点型转换为整型时,会将小数部分去掉。
v1 = 3.14 data = int(v1) print(data) # 3
想要保留小数点后N位
v1 = 3.1415926 result = round(v1,3) print(result) # 3.142
在项目中遇到小数点如何做?
import decimalv1 = decimal.Decimal("0.1")
v2 = decimal.Decimal("0.2")
v3 = v1 + v2
print(v3) # 0.3
总结
集合,是 无序、不重复、元素必须可哈希、可变的一个容器(子孙元素都必须是可哈希)。
集合的查找速度比较快(底层是基于哈希进行存储)
集合可以具有 交并差 的功能。
字典是 无序、键不重复 且 元素只能是键值对的可变的一个容器(键子孙元素都必须是可哈希)。
py3.6+之后字典就变为有序了。
py3.9 新增了一个
{} | {}
运算。字典的常见功能。
在python2和python3中,字典的 keys() 、values()、items() 三个功能获取的数据类型不一样。
None是代表内存中的一个空值。
0 "" [] or list() () or tuple() set() None {} or dict()
浮点型用于表示小数,但是由于其内部存储原理可能会引发数据存储不够精准。
9.基本数据类型详细讲解-set/dict/float相关推荐
- 详细讲解int、float与double的区别
最近为了看一下float的精确度仔细看了一下这三种数据在内存中的样子,看了一下别人的博客发现大家对精度都有这不同的定义,我自己也简单画了一下. 下面来主要讲解一下int.float与double三者的 ...
- java回忆录—输入输出流详细讲解(入门经典)
今天我们开始进入学习 java 中比较让人头疼的事, 那就是 I/O 流.多线程.网络编程.这里对 I/O 流的一个详细讲解.希望对大家有点用吧.(不看后悔哦) 一.什么是IO Java中I/O操作主 ...
- Yaml版接口自动化详细讲解(Python + pytest + allure + log + yaml + mysql + redis + 钉钉通知 + Jenkins)
目录 框架介绍 框架结构 框架功能讲解 common # 配置 config.yaml # 公共配置 setting.py # 环境路径存放区域 data # 测试用例数据 Files # ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- C语言答案解析,C语言题库带详细讲解答案解析.doc
C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...
- PHP 操作redis 详细讲解
2019独角兽企业重金招聘Python工程师标准>>> Redis 菜鸟教程学习网址 http://www.runoob.com/redis/redis-install.html 挺 ...
- 十一,常量(constant)详细讲解
常量(constant)详细讲解 常量,是一种在程序中保持类型和值不变的数据,按照类型有以下几种常量: 1.整型常量 2.实型常量 3.字符常量 4.字符串常量 5.枚举常量 一,整型常量(Integ ...
- java将一个整数按字节输出_在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解。其他的三种类型如下:1、...
在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1. 基本类型:short 二进制位数:16 ...
- Java语言基础详细讲解
就像人与人之间交流使用的语言需要遵循一定的语法规则一样,Java语言也离不开特定语法的支持,如基本语法.数据类型.变量.常量.运算符与表达式.类型转换和输入输出等,只不过这些语法要比日常生活中语言的语 ...
最新文章
- vue创建二:引入本地图片
- web播放器(falsh,audio)
- [原理篇] 逻辑回归
- 什么是进程?Python进程各部分内容介绍
- 中央暗示:07年别急买房
- k1658停运到什么时候_春节网购别被商家忽悠!春节快递不停运,但价格会和平时不一样...
- 无侵入性的在日志中打印对象的关键字段
- Unreal Engine 4添加自定义Settings到项目设置
- 自动驾驶 6-3 几何横向控制 - Stanley Geometric Lateral Control - Stanley
- JavaScript快速入门-基础
- npm安装vant(有赞UI)框架 - cmd篇
- 安卓手机如何打开.crx文件_安卓手机打开.crx文件的方法
- windows防火墙是干什么的_Windows 之 防火墙
- 每日一练——回文链表
- 屏蔽Enter键和ESC键的方法
- 躁!DJ 风格 Java 桌面音乐播放器
- BCD编码和ASCII码
- 获取滚动条滚动距离兼容写法
- 基于 FPGA 的 UART 控制器设计(VHDL)(下)
- OpenJudge NOI题库 1.7 编程基础之字符串
热门文章
- 《果然新鲜》电商项目(36)-SSO单点登录(集成SSO认证服务)
- 【UVM基础】`uvm_info (“TRACE“, $sformatf(“%m“), UVM_HIGH);
- linux c 编译器 macs,【MACS】MACS(Model-based Analysis of ChIP-Seq)使用说明
- 双屏异触 --- 实现指定触摸为副屏触摸功能
- 7-18 斐波那契数列 (10 分)
- 十大经典排序算法之鸡尾酒排序
- Android Studio 误将工程下的build删除
- Spark之Column
- 基于java的毕业设计选题双选系统
- Android 持续搜集关于Android使用工具