day7-集合和字符串
集合
-
什么是集合
集合是容器型数据类型,将{}作为容器的标志,里面多个元素用逗号隔开:{元素1,元素2...}
集合是可变的(支持增删改查),集合是无序的(不支持下标操作)
元素是不可变类型,唯一的:
1)空集合
x = {} # 空字典 s1 = set() # 空集合 print(type(x),type(s1)) # # <class 'dict'> <class 'set'>
2)元素是不可变的
s2 = {10,'abc',(1,2)} # 报错,列表可变不能作为集合元素 # s3 = {10,'abc',[1,2]} # s3 = {10,'abc',[1,2]} #
3)集合的唯一性
s4 = {1,52,3,52,1} # {1, 3, 52} print(s4) # 集合去重 names = ['张三','李四','张三'] print(list(set(names))) # ['李四', '张三']
4)集合是无序的
print({1,2,3} == {2,3,1}) # True
-
集合的增删改查
1)查 - 集合只能遍历
# 补充:通过for循环无序序列的时候,都是先将序列转换成列表,然后编列列表 games = {'王者','和平精英','我的世界','贪吃蛇'} for i in games: print(i)
2)增
# 集合.add(元素) - 在集合中添加指定元素 # 集合.update(序列) - 将序列中所有的元素添加到集合中(序列中的元素是不可变的) games = {'王者','和平精英','我的世界','贪吃蛇'} games.add('英雄联盟') print(games) games.update({'开心消消乐','QQ炫舞'}) print(games) # # {'王者', '英雄联盟', 'QQ炫舞', '开心消消乐', '我的世界', '贪吃蛇', '和平精英'}
3)删
# 集合.remove(元素) - 删除集合中指定的元素(元素不存在会报错) # 集合.discard(元素) - 删除集合中指定的元素(元素不存在不会报错) games = {'王者', '英雄联盟', 'QQ炫舞', '开心消消乐', '我的世界', '贪吃蛇', '和平精英'} games.remove('贪吃蛇') print(games) # {'英雄联盟', '开心消消乐', 'QQ炫舞', '和平精英', '我的世界', '王者'} games.discard('我的世界') print(games) # {'和平精英', '英雄联盟', '王者', 'QQ炫舞', '开心消消乐'}
4)改 - 先删除原来的,再添加新的
games.remove('和平精英')
games.add('部落冲突')
print(games) # # {'开心消消乐', '部落冲突', '英雄联盟', '王者', 'QQ炫舞'}
-
数学集合运算
python中的集合支持数学中的集合元素:&(交集)、|(并集)、-(差集)、^(对称差集)、> >= < <=(判断子集包含关系) # 集合1 & 集合2 - 求两个集合的公共部分 print({1,5,2}&{5,3,6,99,2,2}) # {2, 5} print({1,5,2,'abc'} & {5,3,6,99,2,2}) # {2, 5} print({1,5,2,'abc'} | {5,3,6,99,2,2}) # {1, 2, 99, 3, 5, 6, 'abc'} print({1,5,2,'abc'} ^ {5,3,6,99,2,2}) # {1, 99, 3, 6, 'abc'} # 2) 集合1 - 集合2 - 集合1中去掉包含集合2中剩下的元素 print({1,5,2,'abc'} - {5,3,6,99,2,2}) # {1, 'abc'} # 3)集合1 > 集合2 - 判断集合2是否是结合1的真子集 # 3)集合1 < 集合2 - 判断集合1是否是结合2的真子集 # 3)集合1 >= 集合2 - 判断集合2是否是结合1的子集 # 3)集合1 <= 集合2 - 判断集合1是否是结合2的子集 print({1,2,3,4} > {1,2}) # True python = {'stu1', 'stu2', 'stu4', 'stu6', 'stu7', 'stu10', 'stu11'} h5 = {'stu1', 'stu3', 'stu5', 'stu7', 'stu8', 'stu10'} java = {'stu1', 'stu2', 'stu5', 'stu6', 'stu7', 'stu9', 'stu12'} # a. 求选课学生总共有多少人 s1 = python | h5 | java print('总人数:',len(s1)) # e. 求选了三门学生的学生的数量和对应的名字 s2 = python & h5 & java print('选了三门课的学生:',len(s2)) # b. 求只选了第一个学科的人的数量和对应的名字 s3 = python - h5 - java print('只选了python的学生:',len(s3)) # c. 求只选了一门学科的学生的数量和对应的名字 s4 = python ^ h5 ^ java - s2 print('只选了一门学科的学生:',len(s4)) # d. 求只选了两门学科的学生的数量和对应的名字 s5 = s1 - s4- s2 print('只选了两门学科的学生:',len(s5))
-
什么是字符串(str)
字符串是容器型数据类型,将‘’、“”、“”“”“”、‘’‘’‘作为容器的标志,里面的每一个基本符号就是字符串的元素
字符串是
不可变
的(不支持增删改);字符串是有序
的(支持下标)元素:引号里面的每个基本单元就是字符串的元素,又叫字符
(一般使用长度为1的字符串来表示字符)
# 空串 s1 = '' s2 = "" s3 = '''''' s4 = """""" print(type(s1)) # # <class 'str'> # 字符串是有序的 print('abc' == 'bac') # False
-
字符
1)转义字符:
在特定的一个或者多个符号前加 \ 让符号具有特殊功能和特殊意义;那么这种带有\ 的字符就是转义字符
转义字符 特殊功能和特殊意义 \n 换行 \t 水平制表符 \' 表示一个普通的单引号 \" 表示一个普通的双赢号 \\ 表示一个普通反斜杠 注意: 任意一个转义字符的长度都是1
2)普通字符:
除了转义字符以外的字符都是普通字符,普通字符在字符串中表示这个符号本身。
-
字符的编码
编码:计算机在存储数据的时候只能存数字(存数字二进制补码),为了能够让计算机存储字符,我们给每一个字符都对应一个数字,那么这个对应的数字就是这个字符的编码值
字符编码表 - 记录字符和数字之间一一对应关系的表就是字符编码表
ASCII码表 Unicode编码表 ASCII码表总共有128个字符对应的编码,主要包含的是美国的通用符号其中包括:数字、字母(大写,小写)数字字符在字母字符的前面,大写字母在小写字母的前面,大写字母和小写字母之间有间隔 Unicode编码表包含ASCII码表 中文编码:4e00 - 9fa5 1)编码字符
print('\u4e00','\u9fa5') # # 一 龥
2)chr(编码值) - 获取编码值对应的字符
print(chr(97)) # a print(chr(65)) # A # 打印所有的中文字符 count = 0 for x in range(0x4e00,0x9fa5+1): print(chr(x),end=' ') count += 1 if count % 25 == 0: print()
3)ord(字符) - 获取字符对应的编码值
print(ord('杨'))
print(bin(ord('杨')),bin(ord('健'))) # 0b110011101101000 0b101000001100101
-
字符串的相关操作
1.获取字符:字符串获取字符和列表获取元素方法一样
1)获取单个字符
sentence = '死亡如风,常伴吾身!' print(sentence[2]) # 如 print(sentence[-8]) # 如
2)字符切片
sentence2 = 'good good study!day up' print(sentence2[5:-2]) # good study!day print(sentence2[::-1]) # pu yad!yduts doog doog
3)遍历
sentence2 = 'good good study!day up' for x in sentence2: print(x) for index,x in enumerate(sentence2): print(index,x) for index in range(len(sentence2)): print(sentence2[index])
2.加法和乘法
print('abc'+'123') # abc123 print('abc'*2) # abcabc
3.比较大小:两个字符串比较大小是比较第一对不相等的字符编码值的大小
char | 判断 |
---|---|
'a' <= char <= 'z' | 小写字母 |
'A <= char <= 'Z' | 大写字母 |
'a' <= char <= 'z' or 'A <= char <= 'Z' | 字母 |
'0' <= char <= '9' | 数字字符 |
'\u4e00' <= char <= '\u9fa5' | 中文范围 |
print('abc' > 'XKKDK') # True
print('abc' > '你好') # False
# 练习:输入一个字符串,统计字符串中小写字母的个数
char = input('请输入:')
count = 0
for x in char:
if 'a' <= x <= 'z':
count += 1
print('输入字符串中小写字母个数:',count)
# 练习:输入一个字符串,删除字符串中所有的中文字符
char = 'nis离开ss===KLKJLk看看'
new_char = ''
for x in char:
if '\u4e00' <= x <= '\u9fa5':
continue
new_char += x
print(new_char)
作业
-
输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
例如: 输入'abcd1234 ' ** 输出'bd24'**
char = 'abcd1234' print(char[1::2]) # bd24
-
输入用户名,判断用户名是否合法(用户名长度6~10位)
user_name = input('输入用户名:') if 6 <= len(user_name) <= 10: print('合法') else: print('不合法')
-
输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)
例如: 'abc' — 合法 '123' — 合法 ‘abc123a’ — 合法
for x in user_name: if not (('a' <= x <= 'z' or 'A' <= x <= 'Z') or '0' <= x <= '9'): print('不合法') break else: print('合法')
-
输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
例如: 'abc' — 不合法 '123' — 不合法 'abc123' — 不合法 'Abc123ahs' — 合法
user_name = 'ad5454ADA' for index in range(len(user_name)): if not ((('a' <= user_name[index] <= 'z' or 'A' <= user_name[index] <= 'Z') or '0' <= user_name[index] <= '9') and 'A' <= user_name[0] <= 'Z') : print('不合法') break else: print('合法')
-
输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串
例如:输入'abc1shj23kls99+2kkk' 输出:'123992'
char = 'abc1shj23kls99+2kkk' new_char = '' for i in char: if '0' <= i <= '9': new_char += i print(new_char)
-
输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)
例如: 输入**'a2h2klm12+' ** 输出 'A2H2KLM12+'
char = 'a2h2klm12+' new_char = '' print(char.upper()) # A2H2KLM12+ for x in char: temp_char = x if 'a' <= x <= 'z': temp_char = chr(ord(x)-32) new_char += temp_char print(new_char)
-
输入一个小于1000的数字,产生对应的学号
例如: 输入'23',输出'py1901023' 输入'9', 输出'py1901009' 输入'123',输出'py1901123'
user_char = int(input('请输入:')) print('py1901{:0>3d}'.format(user_char)) user_char = int(input('请输入:')) print('py1901'+user_char.zfill(3))
-
输入一个字符串,统计字符串中非数字字母的字符的个数
例如: 输入'anc2+93-sj胡说' 输出:4 输入'===' 输出:3
char = 'anc2+93-sj胡说' count = 0 for i in char: if not ('a' <= i <= 'z' or 'A' <= i <= 'Z' or '0' <= i <= '9'): count += 1 print(count)
-
输入字符串,将字符串的开头和结尾变成'+',产生一个新的字符串
例如: 输入字符串'abc123', 输出'+bc12+'
char = 'abc123' print(char.center(len(char)+2,'+'))
- 输入字符串,获取字符串的中间字符
例如: 输入'abc1234' 输出:'1' 输入'abc123' 输出'c1'
char = 'abc123'
if len(char) & 1:
print(char[len(char) // 2 -1])
else:
print(char[len(char) // 2 - 1],char[len(char) // 2])
- 写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8
char = 'how are you? Im fine, Thank you!'
print(char.find('you')) # 8
print(char.find('you',50)) # -1 索引超出范围,不会报错返回 -1
print(char.index('you')) # 8
# print(char.index('you',50)) # 索引超出范,会报错
- 获取两个字符串中公共的字符
例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3
str1 = 'abc123'
str2 = 'hua1112bk333'
new_str = ''
for x in str1:
for i in str2:
if x == i and x not in new_str:
new_str += x
print(new_str)