字典&集合&字符串

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()

`

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值