八 散列类型与字符串格式化
8.1 散列类型(哈希类型)
8个基本数据类型
int float bool str list tuple set dict
- 按照数据结构划分
数值类型 int float bool 单个数值
序列类型 str list tuple 存储多个数据 (有序) 有序意味着存在下标
散列类型 set dict 存储多个数据 (无序)
散列类型特征
- 无序, 意味着 序列那一套规则 不适用
- 去重的,散列类型数据无法重复
8.1.1 集合(set)
8.1.1.1 概念
集合(set) -》 负责存储【不重复的数据】,并且是【无序存储】的容器,主要是用于来 去重或者逻辑比较的容器
生活中什么东西如果重复了,就违背它的意义了
- 身份证号
- 电话号码
- 人
- 二维码
- 指纹
- 学号
- …
8.1.1.2 性质
唯一性:元素唯一存在的,不能重复
可变性:集合和列表一样是可变的,可以增可以删
无序性:没有特定的方法去访问指定位置的元素
# 如何创建一个集合?
# {数据1,数据2,数据3,....}
set1 = {1,2,3,4,3,2,1,5,6,7,7,7,9,8,0}
print(set1) # 里面的数据 默认去重 唯一性
set1 = {1,2,3,4,3,2,1,5,6,7,7,7,9,8,0}
print(set1) # 里面的数据 默认去重
# print(set1[0]) # 散列类型都没有下标,无法直接提取。报错
print(type(set1))
# 注意:创建空集合的时候,必须使用set()表示一个空集合,而不能直接{}
空列表 []
空元组 ()
元组单个元素的时候,不能直接 (1)
单个元组 (1,)
空字符串 ""
空集合 set()
空字典 {}
# 集合也支持使用推导式
# 列表推导式
arr = ["6" for i in range(1,11)]
# 集合也支持推导式
set1 = {i for i in range(1,11)}
print(set1)
# li = [1,2,3,4,6,6,6,6,6,6,6,7,7,8]
# 专门利用集合来帮助去重,经常需要利用集合的性质来去重
li = set(li)
li = list(li)
print(li)
# 一行写完
li = list(set(li))
print(li)
8.1.1.3 运算
运算操作 | Python运算符 | 含义 |
---|---|---|
交集 | & | 取两集合公共的元素 |
并集 | | | 取两集合全部的元素 |
差集 | - | 取一个集合中另一集合没有的元素 |
成员运算 | in 和 not in | 判断一个某个元素是否在或者不在集合中 |
集合1 & 集合2 --> 判断交集 shift + 7 => &
集合1 | 集合2 --> 判断并集 shift + \ => |
集合1 - 集合2 --> 判断差集 -
y = ["apple", "banana", "cherry"]
t = ["banana", "cherry",'orange']
# 统计以下,连续两年卖的最好的水果
print(set(y) & set(t))
8.1.1.4 方法
-
增
-
add() : 参数为要添加的数据, 随机添加到集合中,位置不确定
s = {'python'} print(s) s.add("java") print(s) s.add('c++') print(s)
-
update() : 参数为序列类型,可以一次性加入多个,拆开后随机加
s = {'python'} s.update(['java','c++','js']) print(s)
-
-
删
-
pop() : 默认删除第一个 python3.6之前 随机删
s = {'python'} s.update(['java','c++','js']) print(s) s.pop() print(s) s.pop() print(s)
-
remove(): 有参数,参数为要删除的元素,如果元素不存在会报错
s = {'python'} s.update(['java','c++','js']) print(s) s.remove('python') # 指定删除python print(s)
-
clear() : 清空集合
s = {'python'} s.update(['java','c++','js']) print(s) s.clear() print(s)
-
8.1.2 字典(dict)
8.1.2.1 概念
之前的容器:list、tuple、set,都是存储一个普通元素
字典用来保存的是 “对应关系” 的 数据类型,特点是用键值对的方式来存储数据
dic = {'彬彬': 10000, '翠果': 6666}
# 语法格式
字典名 = {键名1:值,键名2:值,键名3:值}
-
什么是字典?
- 由一系列 键值对 组成的 映射 容器 - 映射:一对一的对应关系。 一个key 对应 一个value - 字典的键必须唯一且不可变
# 散列类型 # 访问方式:字典[key] # person = ['小红',18,'女'] # person2 = ['小白','男',19] person = { 'name':'小红', 'age':18, 'sex':'女' } print(person['name']) print(person['age']) print(person['sex']) person2 = { # 字典: 查询 'name':'小红', 'sex':'女', 'age':18, } print(person2['name']) print(person2['age']) print(person2['sex'])
person1 = {"姓名":'王立宏','年龄':18,'分数':99,'性别':'男'}
person2 = {"姓名":'周杰沦','年龄':18,'分数':99,'性别':'男'}
person3 = {"姓名":'蔡徐昆','年龄':18,'分数':99,'性别':'男'}
person4 = {"姓名":'林俊捷','年龄':18,'分数':99,'性别':'男'}
data = [person1,person2,person3,person4] # 列表套字典
for i in data:
print(i['姓名'],i['分数'])
# 字典套字典
data = {
1:{"姓名":'王立宏','年龄':18,'分数':99,'性别':'男'},
2:{"姓名":'周杰沦','年龄':18,'分数':99,'性别':'男'},
3:{"姓名":'蔡徐昆','年龄':18,'分数':99,'性别':'男'},
4:{"姓名":'林俊捷','年龄':18,'分数':99,'性别':'男'}
}
# 字典套娃
heroes = {
"孙尚香": {
"role": "射手",
"attack": 220,
"health": 3000,
"level": 18,
"equipment": []
},
"张飞": {
"role": "坦克",
"attack": 150,
"health": 4000,
"level": 15,
"equipment": []
}
}
equipment = {
"破军": {"attack": 40, "health": 0},
"影刃": {"attack": 30, "health": 200},
"不死鸟之眼": {"attack": 0, "health": 300},
"无尽战刃": {"attack": 60, "health": 0},
"名刀·司命": {"attack": 20, "health": 150},
"抵抗之靴": {"attack": 0, "health": 250},
"狂暴之斧": {"attack": 45, "health": 100},
"隐忍之足": {"attack": 0, "health": 200},
"魔女斗篷": {"attack": 0, "health": 400},
}
8.1.2.2 性质
-
无序 :没有下标,全靠key来查询
访问方式: 字典[key]
-
不重复:key无法重复
heroes = {'a':1,'b':2,'a':3} # 字典的键是无法存在相同的,具有相同的key的时候,默认取最新的键值对 print(heroes) print(heroes['a'])
-
可变性:字典里面的数据是可改
d = {'a':1,'b':2,'c':3} d['a'] = 10 # 可以直接通过key访问修改 print(d)
8.1.2.3 方法
-
增
# 一般新增加 键值对,直接访问赋值 d = {'a':1,'b':2,'c':3} print(d) # 添加一个 "e":5 d['e'] = 5 # 如果该key本身不存在,赋值的话,直接添加到字典里面 print('e') print(d) # 也有方法。但是用的少 d = {'a':1,'b':2,'c':3} print(d) d.setdefault("e",5) # 第1个参数为key,第2个参数为value print(d)
-
删
-
pop(key) : 删除某键值对
列表中 pop 是通过 下标 删除 字典中 pop 是通过 key 删除 键值对 集合中 pop 删除首个 d = {'a':1,'b':2,'c':3} print(d) d.setdefault("e",5) # 第1个参数为key,第2个参数为value print(d) d.pop('a') # 删掉key为'a'的键值对 print(d)
-
clear() : 清空字典
d.clear() print(d) # {}
-
-
改
- 推荐直接赋值 d = {'a':1,'b':2,'c':3} d['c'] = 10 # 如果有,那就是修改 d['f'] = 100 # 如果没有,那就新增 - 也有方法 # 可以批量修改(包括了新增) d.update({'f':200,'z':'666'}) print(d)
-
查
- 查value
# 查value 字典[key] # 查询 # 通过方法查value 字典.get(key,defult=None) # 查询,区别是如果没找到key,则返回defult
-
字典.keys() : 获得所有的键,返回一个 伪列表类型
d = {'a':1,'b':2,'c':3,'d':4} # 遍历字典 (键值对) # d.keys() 以列表的形式,返回所有的key arr = list(d.keys()) for key in arr: print(key,d[key])
-
字典.values() : 获得所有的值 ,返回一个 列表类型
d = {'a':1,'b':2,'c':3,'d':4} print(d.values()) # 1,2,3,4
8.2 字符串格式化
name = '彬彬'
age = 18
# 将变量放到一个字符串中
# 方法一:利用字符串的拼接
print('大家好,我是' + name + ' 我今年' + str(age) + '岁')
# 方法二:利用print多个值输出
print('大家好,我是',name,' 我今年',age,'岁' ,sep="")
# 能不能直接让 字符串中识别变量?
print('大家好,我是name,我今年age岁')
8.2.1 %(占位符)
常用的占位符
%s 字符串--》 占了一个位置,后续存储字符串
%d 整数 --》 占了一个位置,只能放整数
%f 小数 --》 占了一个位置,只能放小数,默认保留6位小数点
%.2f # 保留2位小数点
%.3f # 保留3位小数点
%.xf # 保留x位小数点
使用语法
"xxxx%dxxxx%s"%(数据1,数据2)
name = '彬彬'
age = 18
height = 1.81
s = '大家好,我是%s,我今年%d岁,身高%f'
print(s%(name,age,height)) # 后续再决定值是什么
print(s%('翠果',19.6,1.888888)) # 后续再决定值是什么
8.2.2 format()方法
使用一对 {} 来占用位置,后续通过字符串.format()方法填参
name = '彬彬'
age = 18
height = 1.81
s = '大家好,我是{},我今年{}岁,身高{}'.format(name,age,height)
print(s)
8.2.3 f-format() 方法
python3.x 提供的
语法: 在字符串的前面 加上f/F, 直接可以在字符串中 写变量放到{}里面
name = '彬彬'
age = 18
height = 1.81
s = f'大家好,我是{name},我今年{age}岁,身高{height}'
print(s)
标签:name,18,age,print,key,类型,散列,字典
From: https://blog.csdn.net/2301_80202670/article/details/143507155