day06 字典集合字符串
一 字典(dict)
引入
问题: 为什么学字典?
可以更好的记录信息
员工:姓名,年龄,身高,体重...
# 使用列表记录姓名
names = ['zs','ls','ww'...]
age =
height =
weight =
# 单独让一位员工介绍
name = 'zs'
age = 20
height = 170
weight = 60
# 可以表示,但是不够好
zs = ['zs',20,170,170]
# 字典:某一个个体的全部信息
zs = {'name':'zs',"age":20,'height':170,"weight":170}
列表和字典区别
列表:强调整体,记录整体的某一个特征
字典:强调个体,记录个体的多个特征。
(一)基本概念
特定:可变类型,元素以键值(key-value)对形式存在,用大括号包围的一种类型。
格式:字典名 = {key1:value1,key2:value2,...}
注意:
-
key:不可变类型,唯一的。
# d1 = {'a':10} # d2 = {10:10} # d3 = {1.4:10} # d4 = {True:10} # d5 = {[1,2]:10} # 错误 # d6 = {(1,2):10} d7 = {{1:1}:10} # 错误
-
value:真正保存的数据,没有任何限制。
创建字典:
d1 = {} # 空字典
d2 = dict() # 空字典
zs = {'name':'zs',"age":20,'height':170,"weight":170}
ls = {'name':'ls',"age":23,'height':180,"weight":70}
students = [zs,ls]
练习:水果店有水果:苹果,香蕉,梨,桃,每种水果都有各自名称,价格,数量等信息,请展示水果店的水果信息。
fruits = [
{'name':'apple','price':5,"weight":100},
{'name':'banana','price':3,"weight":50},
{'name':'peach','price':8,"weight":40},
{'name':'pear','price':3.5,"weight":10},
]
for index,info in enumerate(fruits,start=1):
print("编号:",index,"水果为:",info)
( 二 )字典的特有方法
1 增加
- 字典名[key] = value:键不存在,将键值对添加到字典最后;如果key存在,则覆盖
- setdefault(key,default_value):键不存在,将键值对添加到字典最后。如果key存在,则不覆盖。
zs = {'name':'zs',"age":20,'height':170}
# 增加键值对:weight
# zs['weight'] = 70
# zs['weight'] = 80 # 覆盖掉原值
# print(zs)
# 增加键值对:weight
zs.setdefault('weight',70)
# zs.setdefault('weight',80) # 不覆盖,
zs.setdefault('name','ls') # 不能修改
print(zs)
2 删除
方法 | 描述 |
---|---|
pop(key) | 弹出,返回并删除指定键对应的值, dict.pop(‘key’) |
popitem() | 弹出最后一个键值对(>=3.7) |
clear() | 清空字典 |
del | 删除整个字典,或者通过字典的key删除对应键值对; |
zs = {'name':'zs',"age":20,'height':170}
# pop(key) # 返回删除的值
# print(zs.pop('age'))
# popitem() # 返回删除的键值对
print("张三的重量是:",zs.popitem()[1])
print(zs)
# del3
del zs # 删除整个zs变量
del zs['name'] # 删除name键值对
# clear()
zs.clear() # 清空字典
3 修改
方法 | 描述 |
---|---|
字典名[key]=value | 通过key 添加value值,如果key存在则覆盖 |
update(dict) | 传递一个字典,如果key相同则覆盖,没有的key则添加 |
zs_1 = {'name':'zs',"age":20,'height':170}
zs_2 = {"name":'zs','weight':60,"age":30}
# zs_1.update(zs_2)
# print(zs_1) # {'name': 'zs', 'age': 30, 'height': 170, 'weight': 60}
# print(zs_2) # 没有变化
zs_2.update(zs_1)
print(zs_1) # 没有变化
print(zs_2) # {'name': 'zs', 'weight': 60, 'age': 20, 'height': 170}
4 查
方法 | 描述 |
---|---|
根据key查找 | 通过指定的key找对应的值 dict[‘key’] |
keys() | 获取字典所有的键 |
values() | 获取字典所有的值 |
items() | 获取字典所有的键值对 |
注意:keys,values,items
获得的类型不是列表,但是是可迭代对象,可以直接使用for循环遍历,如果需要按照列表方式操作,需要先转化为列表。
zs = {'name':'zs',"age":20,'height':170}
for i in zs.keys():
print(i) # 打印所有的键
for i in zs.values():
print(i) # 打所有的值
for i in zs.items():
print(i) # 打印所有的键值对(元组形式)
# 直接遍历字典,相当与遍历所有的键
for i in zs:
print(i) # 打印所有的键
(三)其他操作
1 get(key,[返回的信息])
: 以键取值,如果指定键不存在,默认返回None,可以指定返回内容
zs = {'name':'zs',"age":20,'height':170}
# print(zs['name']) # zs
# print(zs['hometown']) # 报错
# 使用get解决
print(zs.get('name',"没有找到")) # zs
print(zs.get('hometown',"郑州")) # 不报错,返回自定义信息
2 in , not in
zs = {'name':'zs',"age":20,'height':170}
# print(zs['name']) # zs
# print(zs['hometown']) # 报错
# 判定
if 'hometown' in zs:
print(zs['hometown'])
3 字典的赋值和遍历
# 赋值:但是将键赋值给遍历
d1 = {1:"a",2:'b
# print(m,n) # 1,2
# 遍历:遍历字典的键
for i in d1:
print(i)
二 集合(set)
集合特点:可变的,使用大括号表示,
集合内的元素:无序的,唯一的、不可改变类型
# 创建一个空集合
s = set()
s = {} # 创建空字典
2 集合操作方法
1 增加
- add(item):将元素添加到集合中,如果元素已经存在,则不添加,如果添加为可变类型则报错。
- update(set)
s = {1,2,3,7,8}
s.add(10) # 将10添加到集合中
s2 = {4,5,6,7}
s.update(s2) #
print(s) # {1,2,3,4,5,6,7,8}
2 删除
- pop():从集合第一个元素删除
- remove(item):删除指定的元素,元素不存在报错
- discard(item):删除指定元素,元素不存在不报错
- del:删除
- clear():清空集合
3 遍历集合
for i in set:
print(i)
4 集合数学运算
1.交集(& 或者 intersection)取公共部分
2.并集 (| 或者 union) 取去除重复部分内容
3.差集 (- 或者 difference)取set1或者set2中除去公共部分的内容
4.反交集 (^ 或者 symmetric_difference)
5.子集 (< 或者 issubset)
6.超集 (> 或者 issuperset)
5 集合的应用场景
- 去重
三 字符串
(一)字符串定义
字符串特点:不可变,有序序列。
( 二 ) 字符串的序列操作
- 索引
- 切片
- 拼接和重复
- 赋值
- 遍历
(三) 字符串的方法
1 查找
方法 | 功能 |
---|---|
find | 查找,返回从左第一个指定字符的索引,找不到返回-1 |
rfind | 查找,返回从右第一个指定字符的索引,找不到返回-1 |
index | 查找,返回从左第一个指定字符的索引,找不到报错 |
rindex | 查找,返回从右第一个指定字符的索引,找不到报错 |
count | 计数功能,返回自定字符在字符串当中的个数 |
2 拆分
方法 | 描述 |
---|---|
partition(mystr) | 把mystr以str分割成三部分,str前,str自身和str后 ,返回元组类型 |
splitlines | 按照行分隔,返回一个包含各行作为元素的列表,按照换行符分割 |
split | 按照指定的内容进行分割,maxsplit:默认将指定的所有的内容进行分割,可以指定 maxsplit的值,如果maxsplit=1 表示只按照第一个指定内容进行分割,后面剩余的不分割。 默认按空格分割,返回列表类型 |
3 替换
方法 | 描述 |
---|---|
replace | 从左到右替换指定的元素,可以指定替换的个数,默认全部替换 |
4 修饰
方法 | 描述 |
---|---|
center | 让字符串在指定的长度居中,如果不能居中左短右长,可以指定填充内容,默认以空格填充 |
ljust | 让字符串在指定的长度左齐,可以指定填充内容,默认以空格填充 |
rjust | 让字符串在指定的长度右齐,可以指定填充内容,默认以空格填充 |
zfill | 将字符串填充到指定的长度,不足地方用0从左开始补充 |
strip | 默认去除两边的空格,去除内容可以指定 ,同时可以去除多个符号 |
rstrip | 默认去除右边的空格,去除内容可以指定 |
lstrip | 默认去除左边的空格,去除内容可以指定 |
5 变形
方法 | 描述 |
---|---|
upper | 将字符串当中所有的字母转换为大写 |
lower | 将字符串当中所有的字母转换为小写 |
swapcase | 将字符串当中所有的字母大小写互换 |
title | 将字串符当中的单词首字母大写,单词以非字母划分 |
capitalize | 只有字符串的首字母大写,字符串首位是空格则不会发生变化 |
expandtabs | 把字符串中的 tab 符号(’\t’)转为空格,tab 符号(’\t’)默认的空格数是 8 |
# 需求:用户输入验证码
r_code = "R ULT"
code = input("请输入验证码(不区分大小写):")
if code.upper() == r_code:
print("验证码正确")
6 判断
方法 | 描述 |
---|---|
isalnum | 判断字符串是否完全由字母或数字组成 |
isalpha | 判断字符串是否完全由字母组成 |
isdigit | 判断字符串是否完全由数字组成 |
isupper | 判断字符串当中的字母是否完全是大写 |
islower | 判断字符串当中的字母是否完全是小写 |
istitle | 判断字符串是否满足title格式 |
isspace | 判断字符串是否完全由空格组成 |
startswith(str) | 判断字符串的开头字符,也可以截取判断 ,如果截取,不包含右边界 |
endswith | 判断字符串的结尾字符,也可以截取判断 |
# 需求:用户输入一些符号,请统计数字个数,字母个数,以及其他符号数量。
my_str = input("随便输入一些符号:")
num_count = 0
alp_count = 0
other_count = 0
for i in my_str:
if i.isdigit():
num_count += 1
elif i.alpha():
alp_count += 1
else:
other_count += 1
四 编码和解码
-
str:用于展示
-
byte:用于传输
-
encode是编码,将字符串转换成字节码。str–>byte
-
decode是解码 ,将字节码转换成字符串。 byte–>str
s = "记得交作业~"
print(len(s)) # 6
# 编码encode():str--->bytes:默认使用utf8编码格式
# s2 = s.encode(encoding="utf8")
# print(s2)
# print(len(s2)) # 16
# 以gbk格式编码
s2 = s.encode(encoding="gbk")
print(s2)
print(len(s2)) # 11
# 接收到消息
# 解码:decode():
# s3 = s2.decode()
# print(s3)
# 以utf-8解码一个以gbk编码的信息:要不报错要不乱码
s3 = s2.decode()
print(s3)
utf-8:英文还是占1个字节,中文占3个字节
gbk:英文还是占1个字节,中文占2个字节
五 转义字符(\)和原生字符(R/r)
msg ='tom's phone number is 110'
print(msg)
转义字符:顾名思义改变原有字符的意义
转义字符格式: \特定字符
问题:有一篇小说,如果内部存在特殊符号,但是不希望表示出特殊含义,需要使用转义符号,但是工作量会很大。
需要使用效率更高的方式解决:原生字符
在任意字符串之前添加字母r或者R,那么当前字符串中所有转义字符在使用时都不会进行转义操作
六 格式化字符串
print(i,"*",j,"=",i*j,) # 2*3= 6 写法不方便
1.% 形式(不推荐)
不足:在定义模板是需要指定传入的数据类型
格式 | 描述 |
---|---|
%% | 百分号标记 |
%s | 字符串 |
%d | 有符号整数(十进制) |
%f | 浮点数字(用小数点符号) |
# 练习:自我介绍,姓名小米,年龄 18, 身高1.75米,体重70kg,目前的学习进度为80%。使用字符串格式化将内容输出到控制台
name = "小米"
age = 18
height = 1.75
weight = 70
print("我叫%s,我今年%d,身高是%f,体重是%d,目前学习进度是%d%%"%(name,age,height,weight,80))
2.使用{}作为占位符:format
# format形式:不需要提前指定类型
# 算数乘法模板
# m = "{}*{}={}"
# print(m.format(2,5,10))
# 1 编号:实际是format中索引值
# m2 = "{100}*{1}={0}"
# print(m2.format(2,5,10)) # IndexError: tuple index out of range
# 注意:要么不编号,要么都要编号,不能有编号和无编号混合
# m3 = "{0}*{1}={0}" # ValueError
# print(m3.format(2,5,10))
# 2 给占位符起名字
# m4 = "{num1}*{num2}={value}" # ValueError
# print(m4.format(num2=5,num1=2,value=10))
"""
3 填充与格式化
格式: :[填充字符][对齐方式 <^>][最小宽度]
< 表示向左对齐, ^表示居中对齐, >表示向右对齐
"""
m = "{:$>10}*{}={}"
print(m.format(5,2,10))
# 4 精度控制
# 字符串长度为10位,居中对齐,不够用# 填充,小数点后保留两位
print("{:#^10.2f}".format(2.34246546))
3.f-string(版本>=3.6)
# m = f"{2}*{3}={6}"
# 打印九九乘法表对比
for i in range(1,10):
for j in range(1,i+1):
# print(j,"*",i,"=",i*j,end='\t') # 不使用格式化
# print("%d*%d=%d"%(j,i,i*j),end='\t') # 使用%方式
# print("{}*{}={}".format(j,i,i*j),end='\t') # 使用format形式
print(f"{j}*{i}={i*j}",end='\t') # 使用f-string形式
print()
`