冒泡法、tuple元组、字符串2、字典
1.一个初级的冒泡法
练习题1: 冒泡排序
list2 = [50,1,2,23,4,5,2,12,45,6,8,9,27,80]
for i in range(1,len(list2)):
for j in range(len(list2)-i):
# 判断前面的数是否比后面的大
if list2[j] > list2[j+1]:
#交叉赋值
list2[j],list2[j+1] = list2[j+1],list2[j]
print(list2)
练习题2: 简单判断字符串是否为数字、字母和下划线“_”组成:
for x in str1:
if x >= "0” and x <= "9" or x =="_" or x>='a' and x<="z" or x>="A" and x <= "Z":
pass
else:
print("包含非法字符")
2. tuple元组
本质:一种有序的集合,一旦初始化,就不能发生变化。
注意:这里说的不能改变,是“指向”不可修改
但是,若tuple中包含list,list中的元素可修改,因为tuple指向的是list的地址
创建:元组名 = (元素1, 元素2 ,元素3,…)
注意:有元素时必须加“,”,括号可以省,但逗号不能省
#创建空的元组
tuple1 = ()
tuple2 = tuple()
#创建带有元素的元组(一定要有逗号)
tuple3 =(22, 33, 14, 109)
tuple4 = (1,)
tuple4 = 1,
#与列表类似,元组中的元素类型可以不同
tuple3 = (23,True,"good")
print(tuple3)
#定义只有一个元素的元组
tuple4 = (1) #注意:这定义的不是元组而是整数1(注意:tuple4 type为int)
tuple4 = (1,) #定义一个元素的元组定义时必须加一个逗号",",用来消除歧义
元组元素的访问
格式: 元组名[下标]
tuple1 = (20, 40, 201, 401)
print(tuple1[0])
#注意使用下标取值的时候,要注意下标的取值范围,不要下标越界
#获取最后一个元素
print(tuple1[-1])
元组的截取
语法:
元组名[start:end]
截取的元组范围[start,end)
功能:获取开始下标到结束下标之前的所有元素。
若不指定start则默认是从开头开始截取到指定位置
若不指定end则默认从指定位置截取到结尾
tuple1 = (1, 2, 3, 8, 'hello', 'good')
tuple2 = tuple1[2:5]
print(tuple2)
#结果
(3, 8, 'hello')
tuple1 = (1, 2, 3, 8, 'hello', 'good')
tuple2 = tuple1[:5]
print(tuple2)
#结果
(1, 2, 3, 8, 'hello')
tuple1 = (1, 2, 3, 8, 'hello', 'good')
tuple2 = tuple1[3:]
print(tuple2)
#结果
(8, 'hello', 'good')
注意:tuple1[:-1] [1:] [-1]
去尾 再去头 再取最后一个
[1 : : -1 ]
1表示从第二个开始 , -1表示从后往前取
元组的方法
- len(tuple)
功能:获取元组元素的个数
tuple1 = (1, 2, 3, 8, 'hello', 'good')
print(len(tuple1))
#结果
6
- max(tuple) 注意:不能比较str类型
功能:获取元组中元素的最大值
tuple1 = (1, 2, 3, 8, 20, 13)
print(max(tuple1))
#结果
20
- min(tuple)
功能:获取元组中元素的最小值
tuple1 = (1, 2, 3, 8, 20, 13)
print(min(tuple1))
#结果
1
- tuple(list)
功能:将列表转换为元组
list1 = [1, 2, 3, 8, 20, 13]
print(tuple(list1))
#结果
(1, 2, 3, 8, 20, 13)
二维元组
t1 = (1,2,3)
t2 = (3,4,5)
特别注意:
t3 = (t1, t2) 结果:((1,2,3),(4,5,6))
t4 = (t1 + t2) 结果: (1,2,3,4,5,6)
3.字符串函数2
之前的学习中已经记录了部分字符串函数,现做个小补充
- 分割与合并
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
注意:如果连接的是字符串,则它会把字符串中的每个字符使用指定字符连接。
这里要记住:
list1 = ['you', 'are', 'very', 'great', '!']
str1 = “ ”.join(list1) #list转字符串
list2 = str.split(" ") #字符串转list
.join()和 .split() 是一对,可互相转换
- 获取最大最小字符
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.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 (组合替换,2替换a,1替换c)
str7 = "how are you ,u ewe "
print(str7.translate(dic))
#结果
how 2re you ,u ewe
#注意:很少用
- 判断字符串的开头结尾
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
- 编码与解码
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 的时候,忽略错误
- 判断是否为字母或数字
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
- 判断大小写
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.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
- ASCII码转换
9.1) ord(str)
功能:获取字符表示 ASCII码值
print(ord("A"))
print(ord("你"))
#结果
65
20320
9.2) chr(str)
把编码转成对应的字符
print(chr(68))
print(chr(20190))
#结果
D
仞
4. dict字典
- 无序的集合
- 采用键—值(key—value)的形式存储
- 优点:具有极快的查找速度
key的特性:
1.字典中的key必须唯一
2.key必须是不可变对象
例如:字符串、整数等都是不可变的,可以作为key
list是可变的,不能作为key
字典的创建:
语法:
字典名 = {键1:值1,键2:值2,…}
dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1)
访问元素
语法:元素 = 字典名[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')
添加元素:
语法:字典名[key] = value
dist1 = {'tom':90,'lili':78, 'lele':92}
dist1['lisi'] = 89
注意:一个key只能对应一个value,多次对一个key的value赋值,后面的值会把前面的值覆盖掉。
字典的遍历
使用for循环遍历
语法:
获取键
for key in dist:
print(key)
获取值
for value in dist.values() :
print(value)
同时获取键和值
for k, v in dist.items() :
print(k, v)
遍历:
key: dic.keys()
value: dic.values()
key&value dic.items() item是tuple(key,value)
注意:字典是无序的,在内存中存储是无序的,因此无法通过下标来获取值