python学习第5天,字典和set

一、String字符串
1.分割和合并

1.1 str1.split(str2, num)

功能:以str2为分割截取字符串,num默认为str1.count()

若给定num 后,则截取num个字符串,剩余的不再进行截取。

str1 = "how are you , i am fine thank you"
#使用空格进行分割
list1 = str1.split(" ")
print(list1)
#结果
['how', 'are', 'you', ',', 'i', 'am', 'fine', 'thank', 'you']

1.2 str1.splitlines([keepends])

功能:字符串会按照行(’\r’,’\r\n’,’\n’)进行分割,返回一个包含各行作为元素的列表,如果参数keepends的值为False,不包含换行符,如果为True,则保留换行符。

str2 = '''how are
you ?
i am
fine
!
'''

list2 = str2.splitlines()
print(list2)
#结果
['how are', 'you ?', 'i am', 'fine', '!']
str2 = '''how are
you ?
i am
fine
!
'''

list2 = str2.splitlines(keepends=True)
print(list2)
#结果
['how are\n', 'you ?\n', 'i am\n', 'fine\n', '!\n']

1.3 str1.join(seq)

功能:以指定字符串作为分隔符,将seq中的所有元素合并成为一个新的字符串

list2 = ['you', 'are', 'very', 'great', '!']
str3 = ' '.join(list2)
print(str3)
#结果
you are very great !
str1 = "how are you , i am fine thank you"
str3 = "*".join(str1)
print(str3)
#结果
h*o*w* *a*r*e* *y*o*u* *,* *i* *a*m* *f*i*n*e* *t*h*a*n*k* *y*o*u

注意:如果连接的是字符串,则它会把字符串中的每个字符使用指定字符连接。

2.获取最大最小字符

2.1 max(str)

功能: 返回字符串str中最大的字母

str1 = "how are you , i am fine thank you"
print(max(str1))
#结果
y

2.2 min(str)

功能:返回字符串str中最小字母

str1 = "how are you , i am fine thank you"
print(min(str1))
#结果
‘ ’

注意:比较的是ASCII码值

3.字符串的替换

3.1 replace(old , new [, count])

功能:将字符串中的old替换成new,若不指定count,则默认全部替换,若指定count,则替换前count个

str1 = "how are you , i am fine thank you"
str2 = str1.replace("you" ,'me')
print(str2)
#结果
how are me , i am fine thank me

3.2 字符串映射替换

参数一:要转换的字符 参数二:目标字符

dic = str.maketrans(oldstr, newstr)

str2.translate(dic)

str5 = "aaa bbb  ccc  deee"
dic = str5.maketrans("ac", "21")
# a--2   c--1
str7 = "how  are you  ,u ewe "
print(str7.translate(dic))
#结果
how  2re you  ,u ewe 
#注意:很少用
4.判断字符串的开头结尾

str.startswith(str1, start=0, end=len(str))

功能:在给定的范围内判断字符串是否以给定的字符串开头,如果没有指定范围,默认整个字符串

str1 = "aaa bbb  ccc  deee"
print(str1.startswith("aa"))
#结果
True


str1 = "aaa bbb  ccc  deee"
print(str1.startswith("aa", 3, 9))
#结果
False

str.endswith(str, start=0, end=len(str))

功能:在给定的范围内判断字符串是否以指定的字符串结尾,若没有指定范围,默认为整个字符串

str1 = "aaa bbb  ccc  deee"
print(str1.endswith("e"))
#结果
True

str1 = "aaa bbb  ccc  deee"
print(str1.endswith("e", 3 ,9))
#结果
False
5.编码与解码

str.encode(encoding=“utf-8”, errors=“scrict”)

功能:字符串的编码,若不指定encoding则默认选择utf-8

str1 = "你好吗?"
data = str1.encode()
print(data)
print(type(data))
#结果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>

str.decode(encoding=“utf-8”)

"hello".encode(“utf-8”).decode()

功能:对字符进行解码,若不指定编码格式,则默认选择utf-8

str1 = "你好吗?"
data = str1.encode()
print(data)
print(type(data))

data2 = data.decode()
print(data2)
print(type(data2))

#结果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>
你好吗?
<class 'str'>

注意:解码时的编码格式要与编码时的保持一致

拓展:errors = ignore 的时候,忽略错误

6.判断是否为字母或数字

str.isalpha()

功能:判断字符串至少有一个字符,并且所有的字符都是字母,若为真则返回True,否则返回False

str8 = "hello ni hao "
print(str8.isalpha())
#结果
False
str9 = "hellonahao"
print(str9.isalpha())
#结果
True

str.isalnum()

功能:判断一个字符串至少有一个字符,并且所有的字符都是字母或数字则返回True否则返回False

str10 = "sc22xdcd"
print(str9.isalnum())
print(str10.isalpha())
#结果
True
False
7.判断大小写

str.isupper()

功能:若字符串中包含至少一个字母的字符,并且这些字母都是大写,则返回True,否则返回False

str10 = "AA2221  111"
print(str10.isupper())
#结果
True

str10 = "AAaaa"
print(str10.isupper())
#结果
False

str.islower()

功能:若字符串中包含至少一个字母的字符,并且这所有的字母都是小写,则返回True,否则返回False

str10 = "aa2221  111"
print(str10.islower())
#结果
True
8.判断是否包含特殊字符

8.1 str.istitle()

功能:如果一个字符串是标题化的则返回True,否则返回False

【标题化】每个首字母大写

str1 = "Hello World"
print(str1.istitle())

8.2 str.isdigit()

isdigit()
True: Unicode数字,byte数字(单字节),全角数字(双字节)
False: 汉字数字, ,罗马数字
Error:
print("123".isdigit())
print("123a".isdigit())
#结果
True
False

同上

str.isnumeric()

功能:若字符串中只包含数字字符,则返回True,否则返回False

isnumeric()
True: Unicode数字,全角数字(双字节),汉字数字
False: 罗马数字,
Error: byte数字(单字节)

8.3 str.isdecimal()

功能:检查字符串是否只包含十进制字符【0,9】,如果是返回True,否则返回False

isdecimal()
True: Unicode数字,,全角数字(双字节),
False: 罗马数字,汉字数字
Error: byte数字(单字节)
print("123".isdecimal())
print("123z".isdecimal())
#结果
True
False

8.4 str.isspace()

功能:如果字符串只包含空格,则返回True,否则返回False

print(" ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())
print("  qq".isspace())

#结果
True
True
True
True
False
9.ASCII码转换

9.1 ord(str)

功能:获取字符表示 ASCII码值

print(ord("A"))
print(ord("你"))
#结果
65
20320

9.2 chr(str)

把编码转成对应的字符

print(chr(68))
print(chr(20190))
#结果
D
仞
二、dict字典
1.概述

dict也是一种存储方式,类似于list和tuple,但是,字典采用键—值(key—value)的形式存储

优点:具有极快的查找速度

2.key的特性

1.字典中的key必须唯一

2.key必须是不可变对象

例如:字符串、整数等都是不可变的,可以作为key

list是可变的,不能作为key

思考:保存一个班级中的童鞋的成绩

思路1:使用list或者tuple,但是容易发生错乱对不上号

思路2:使用二维list或者tuple,但是会比较慢

思路3:可以采用字典,将学生的学号或者名字作为key,成绩为value进行存储,方便查找

3.字典的创建

语法:

字典名 = {键1:值1,键2:值2,…}

dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1)
4.字典操作

4.1访问元素

语法:元素 = 字典名[key]

dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1['tom'])

注意:在key不存在的情况下,会报错

语法: 元素 = 字典.get(key)

功能:使用get的方法获取值,若key存在,则返回value的值,若key不存在则返回None

dist1 = {'tom':90,'lili':78, 'lele':92}
value = dist1.get('tom')
print(value)

4.2 添加元素

语法:字典名[key] = value

dist1 = {'tom':90,'lili':78, 'lele':92}
dist1['lisi'] = 89
print(dist1)

注意:一个key只能对应一个value,多次对一个key的value赋值,后面的值会把前面的值覆盖掉。

4.3 删除元素

语法:字典名.pop(key)

dist1 = {'tom':90,'lili':78, 'lele':92}
dist1.pop('tom')
print(dist1)
5.字典的遍历

5.1 使用for循环遍历

语法:

获取键

for key in dist:

​ print(key)

获取值

for value in dist.values() :

print(value)

同时获取键和值

for k, v in dist.items() :

print(k, v)

注意:字典是无序的,在内存中存储是无序的,因此无法通过下标来获取值

dist1 = {'tom':90,'lili':78, 'lele':92}
#获取字典的key
for key in dist1:
	print(key)
#获取字典中的value	
for value  in dist1.values():
	print(value)
#同时获取字典中的key与value
for k, v  in dist1.items():
	print(k, v)
6.与list的区别

1.dict的查找和插入的速度极快,不会随着key-value的增加而变慢,但是list在查找的时候需要从头向后挨个遍历元素,并且当数据量增大的时候,速度也会随着变慢

2.dict需要占用大量的内存,内存浪费多,而list只相当于存储了字典的key或者value部分,并且数据时紧密排列的。

三、set集合
1.概述

set与dict类似,也是一组key的集合,但与dict的区别在于set不存储value

本质:无序且无重复元素的集合

2.set的创建

语法:

set1 = set([1, 2, 3, 4, 5])

注意:创建set需要一个list或者tuple或者dict作为输入集合,重复的元素在set中会被自动的过滤

s1 = set([1, 2, 3, 4, 5])
print(s1)
3.set操作

3.1 set.add()

注意:

1.可以添加重复的元素,但是不会有效果

2.add 的元素不能是列表或者字典,因为他们是可变的

s1 = set([1, 2, 3, 4, 5])
s1.add(6)
s1.add((2, 3, 4))
print(s1)
#结果
{1, 2, 3, 4, 5, 6, (2, 3, 4)}

3.2 set.update()

功能:插入整个list、tuple、字符串打碎插入

注意:不能直接插入数字

s1 = set([1, 2, 3, 4, 5])
s1.update([4,"anam","hha"])
s1.update("hello")
print(s1)
#结果
{1, 2, 3, 4, 5, 'anam', 'l', 'o', 'h', 'e', 'hha'}

3.3 set.remove(元素)

功能:删除元素

s1 = set([1, 2, 3, 4, 5])
s1.remove(3)
print(s1)

3.4 遍历元素

语法:

for i in set :

print(i)

注意:set是无序的,因此不能通过下标获取元素

for index, data in enumerate(set):

​ print(index, data)

可以通过这种方式,来强行添加下标

s1 = set([1, 2, 3, 4, 5])
for i in s1:
	print(i)

for index,data in enumerate(s1):
	print(index, data)

3.5 交集与并集

语法:

交集 newest = set1 & set2

并集 newest = set1 | set2

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7])
s3 = s1 & s2
s4 = s1 | s2
print(s3)
print(s4)
#结果
{4, 5}
{1, 2, 3, 4, 5, 6, 7}
四、类型转换

主要针对几种存储工具:list、tuple、dict、set

特殊之处:dict是用来存储键值对的

4.1 list 转换为set
l1 = [1, 2, 4, 5]
s1 = set(l1)
print(type(s1))
print(s1)

4.2 tuple 转换为set

t1 = (1, 2, 3, 4)
s1 = set(t1)
print(type(s1))
print(s1)

4.3 set转换为list

s1 = set([1, 2, 3, 4])
l1 = list(s1)
print(type(l1))
print(l1)

4.4 set转换为tuple

s1 = set([1, 2, 3, 4])
t1 = tuple(s1)
print(type(t1))
print(t1)
五、迭代器
列表生成式

语法:

list = [result for x in range(m, n)]

需求:创建一个[1, 2, …100]的列表

>>> range(1, 101)
[1, 2, 3, 4, 5,...,100]

需求2 :生成一个[1x1, 2x2, 3x3,….100x100]的列表

>>> list1 = []
>>> for x in range(1, 101)
		list1.append(x*x)
>>> list1
[1, 4, 9,....10000]

#使用列表生成式,可以这么来写
>>> list2 = [x*x for x in range(1, 101)]
5.1 可迭代对象

1.可以直接作用于for循环的对象统称为可迭代对象,我们称之为:Iterator

2.我们可以使用isintance()判断一个对象是否是Iterator对象

3.可以直接作用于for循环的数据类型有以下几种

​ a.集合数据类型:如list、tuple、dict、set和string

​ b.生成器(generator):就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器。

生成器:

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,如果我们仅仅需要访问前面几个元素,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)

#要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
>>> g = (x for x in range(1, 101))
>>> g
<generator object <genexpr> at 0x10124df68>
>>> g.__next__()
1
>>> [x for x in g]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

注意:使用Iterator判断的时候需要导入Iterable的包

from collections import Iterable

print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance("",Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(1,Iterable))
#结果
True
True
True
True
True
False

#####5.2 迭代器

迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值

可以被next()函数调用并不断返回下一个值得对象成为迭代器(Iterator对象)

可以使用isinstance()函数判断一个对象是否是Iterator对象

print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance("",Iterator))
# 只有这个是迭代器
print(isinstance((x for x in range(10)),Iterator))

#结果
False
False
False
False
True
5.3 Iterator转换

可以通过Iter()函数将list、tuple、dict、string转换为Iterator对象

>>> a = iter([1, 2, 3, 4, 5])
>>> print(next(a))
1
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
#结果
True
True
True
True
六、练习
1.从控制台输入一个正数n,则打印n行*
'''
	*
  * *
* * *
'''

2.冒泡排序,从控制台输入一个数值列表,对列表进行冒泡排序

例如:[1, 3, 2, 6, 8, 5]

结果:[8, 6, 5, 3, 2, 1]

3.输入一个时间,获取这个时间的下一秒

#从控制台输入一个时间【06:34:52】,打印出这个时间的下一秒【06:34:53】
【时:分:秒】

4.歌词解析器

1.把歌词进行解析切片处理,把时间转成对应的浮点数

2.使用字典将时间与歌词进行存储{时间:歌词}

3.循环自动打印歌词【结束循环的条件,key为None的时候】

musicLrc = '''[00:03.50]传奇
[00:19.10]作词:刘兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]    
[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也没能忘掉你容颜
[02:54.83][00:51.24]梦想着偶然能有一天再相见
[03:02.32][00:58.75]从此我开始孤单思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你时你在天边
[03:16.90][01:13.13]想你时你在眼前
[03:24.42][01:20.92]想你时你在脑海
[03:31.85][01:28.44]想你时你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约
[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变
[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现
[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远
[04:39.55][04:09.00][02:07.85]
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值