集合和字符串
集合
1.什么是集合(set)
集合是…容器型数据类型;将{}作为容器的标志,多个元素用逗号隔开:{元素1,元素2,元素3,}
集合是可变的;无序的;
元素:不可变的,唯一的
进行数据遍历的时候,效率比较高,高于有序
空集合
x = {} # {}是空字典
print(type(x))
y = set() # 空集合
print(type(y), len(y))
元素是不可变的
# set1={12,'abc',[10,20]} #TypeError: unhashable type: 'list'
set2 = {12, 'abc', (10, 20)}
元素是唯一的(集合自带去重功能)
names = {'张三', '李四', '王五', '张三'}
print(names) #{'王五', '张三', '李四'}
集合去重
names = ['张三', '李四', '王五', '张三']
names=set(names)
print(names) #{'张三', '李四', '王五'}
集合是无序的
print({1, 2} == {2, 1}) # True
2.集合的增删改查
1)查 - 遍历
set4 = {10, 20, 78, 90}
for x in set4:
print(x,end=' ') #10 20 90 78
print()
2)增
set4 = {10, 20, 78, 90}
a:集合.add(元素) - 在集合中添加元素
set4.add(100) #{100, 10, 78, 20, 90}
print(set4)
b:集合.update(序列) - 将序列中所有的元素添加到集合中
set4.update('abc')
print(set4) #{'c', 100, 10, 'b', 'a', 78, 20, 90}
3)删
a.集合.remove(元素) - 删除指定元素(如果元素不存在,会报错)
set4 = {10, 20, 78, 90}
set4.remove(78)
print(set4) #{10, 20, 90}
# set4.remove(200) #KeyError: 200
b.集合.discard(元素)-删除指定元素(如果元素不存在,不会报错)
set4 = {10, 20, 78, 90}
set4.discard(78) # {10, 20, 90}
print(set4)
set4.discard(200) # 不会报错
4)改 - 无法修改元素
3.数学集合运算
python中的集合支持数学的集合运算:子集(>,<,>=,<=)、并集(|)、交集(&)
1)子集
print({200, 300, 400} > {1, 2}) #False 对于集合来说,此种方式不是比大小,而是判断子集
a.集合1>集合2 -判断集合2是否是集合1的真子集
print({10, 20, 30} > {10, 20}) #True
print({10, 20} > {10, 20}) #False
b.集合1>集合2 - 断集合2是否是集合1的子集
print({10, 20, 30} >= {10, 20}) # True
print({10, 20} >= {10, 20}) # True
2)并集
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 | set2) #{1, 2, 3, 4, 5, 6, 7, 8}
3)交集
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 & set2) #{4, 5, 6}
4)差集
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
print(set1 - set2) #{1, 2, 3}
5)对称差集
print(set1 ^ set2) #{1, 2, 3, 7, 8}
题目实例:一共有三门学科可供学生选择,学生可选择一门,两门或者三门课程
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字
python ={'stu1','stu2','stu5','stu8','stu10'}
java={'stu3','stu5','stu6','stu7','stu8','stu10'}
h5={'stu2','stu4','stu5','stu7','stu9','stu10'}
stu_all=python|java|h5
print("选课总人数为:",len(stu_all))
only_python=python-java-h5
only_java=java-python-h5
only_h5=h5-python-java
print("只选择了第一个学科的人共有:",
len(only_python),'对应名字为:',only_python)
only_one_subject=only_h5|only_java|only_python
print("只选择了一门学科的人共有:",
len(only_one_subject),'对应名字为:',only_one_subject)
only_three_subject=python&java&h5
print("选择了三门学科的人共有:",
len(only_three_subject),'对应名字为:',only_three_subject)
only_two_subject=stu_all-only_three_subject-only_one_subject
print("选择了两门学科的人共有:",
len(only_two_subject),'对应名字为:',only_two_subject)
字符串
1.什么是字符串
字符串是容器型数据类型;
以’‘或者"“或者”"""""或者’’’’’‘作为容器的标志,里面多个字符(任意符号)
不可变(不支持增删改);有序的(支持下标操作)
字符串的元素:字符串的每个基本单元,字符(任何符号都可以)
字符串
‘’’’’'和""""""引起来的字符串可以直接敲回车换行
str1='ab' \
'c'
str2='''hcl
fya
fy
dm
'''
2.字符
python没有字符对应的类型,只有字符的概念
1) 普通字符: 包含所有的符号,:数字,字母,中文、各种图形,符号等
2)转义字符: 和\结合后具有特殊功能和特殊意义的字符,就是转义字符(转义字符不是python中的概念)
\n - 换行(表示为1个符号)
\t - 一个水平制表符(相当于按一次tab键)
’ - 一个单引号
" - 一个双引号
\ - 一个反斜杠字符
注意:任意一个转义字符的长度是1
“”"
\u 加上4位的16进制数 - 编码字符
普通字符
str1= '123'
str2='ahsj'
str3='你好世界'
str4='+=#'
str5='🐻❄❀🐕🕊🐟🌳'
print(str5)
转义字符
print("=====================")
str1 = '123\nabc'
print(str1)
print(len(str1))
poem = "鹅鹅鹅\n曲项向天歌\n白毛浮绿水\n红掌拨清波"
print(poem)
str2= '123\'abc' #不加\会产生歧义
str3= "123\"abc" #不加\会产生歧义
str4= '123\\nabc' #123\nabc
print(str4)
str5= '\t123abc'
print(str5)
str6 = '123\u4effc'
print(str6,len(str6)) #123仿c 5
3.阻止转义
python中在字符串的最前面加r/R,可以让这个字符串中所有的转义字符的功能消失
str7 = '\t123\nabc\\aaa\u4e00'
print(str7,len(str7)) #abc\aaa一 13
str8 = R'\t123\nabc\\aaa\u4e00'
print(str8,len(str8)) #\t123\nabc\\aaa\u4e00 21
字符编码
1.计算机数据存储
计算机在存储数据的时候,只能直接存储数字数据,而且以二进制的形式存储的数字。
内存的硬件只有二极管,通过二极管的导通或关闭来存贮数据
数据单位:
位(bit)
1字节(byte)==8位
1kb=1024byte
1mb=1024kb
1Gb=1024mb
1T=1024Gb
2.字符编码
1)字符编码
为了能够让计算机存贮字符,我们给每个字符关联一个具体的数字,在需要存贮字符的时候就存储字符对应的数字。
每个字符对应的数字就是字符的编码子
2)编码表
保存字符和数字的一一对应关系的表就是字符编码表,常用的字符编码表有两中:ASICC码表、Unicode编码表
a.ASICC: 使用一个字节对128个字符进行编码(最高位是符号位,所以一共有128个),其中包括常用的英文符号、数字和字母。
数字编码在字母的前面,大写字母的编码在小写字母的前面,大写字母和小写字母不连续
b.Unicode编码表: 叫万国码,包含了世界上所有国家所有名族的所有语言符号。前128个字符就是ASICC码表中的字符,
其中中文的编码范围是:4e00~9f55
编码字符:\u四位的16进制数(这儿的4位的16进制就是字母的编码值)
str1 = 'a\u0061' #0061是97的16进制数
print(str1) #aa
3.chr函数
chr(编码值) - 获取编码值对应的字符
print(chr(97)) #a
print(chr(0x4e00)) #一
4.ord(字符) - 获取字符的编码值
print(ord('胡'),ord('朝'),ord('林'))
print(hex(ord('胡')),hex(ord('朝')),hex(ord('林')))
练习:打印所有的汉字
for x in range(0x4e00,0x9f55+1):
print(chr(x),end=' ')
字符串的相关操作
1.获取字符串
字符串获取字符和列表获取元素的方法一样
1)获取单个字符
str1 = '人生苦短,我用python!'
print(str1[3])
str2 = 'how are\n you'
print(str2[9], str2[-3])
2)切片
message = '我对你的敬仰犹如滔滔江水,连绵不绝'
print(message[1:])
print(message[2:10:3])
print(message[-10:-2:-1]) # ''
3)遍历
message = '假和尚吃肉,真和尚喝酒'
for x in message:
print(x)
message3 = 'you jump, i jump!'
for x, y in enumerate(message3):
print(x, y)
练习1:打印每个字符的编码值
message3 = 'you jump, i jump!'
for x in message3:
print(ord(x))
练习2:统计中文个数
message3 = '人生苦短,我用python!'
count = 0
for x in message3:
if 0x4e00 <= ord(x) <= 0x9f55: # 使用hex转换成16进制后为字符串,不是数字
count += 1
print(count)
2.加法和乘法运算
字符串1+字符串2–将两个字符串合并产生一个新的字符串
str1 = 'abc' + '123'
print(str1)
字符串N/N字符串 - 字符串重复N次产生一个新的字符串
str2 = 'abc' * 3
print(str2) # abcabcabc
3.比较运算:>,<,>=,<=
两个字符串比较大小比较的是第一对不相等的字符的编码值大小
判断一个字符是否是小写字母:‘a’<=x<=‘z’
判断一个字符是否是小写字母:‘A’<=x<=‘Z’
判断一个字符是否是字母:‘A’<=x<=‘Z’ or ‘a’<=x<=‘z’
判断一个字符是否是数字字符:‘0’<=x<=‘9’
判断一个字符是否是中文字符:’\u4e00’<=x<=’\u9f55’
print('abc' > 'zdfsdfsd') # False
练习:取出字符串中所有的小写字母
str3 = 'jhdjfdk,我喜欢jhg美女MP'
str4 = ''
str5 = ''
for i in str3:
if 'a' <= i <= 'z':
str4 += i
if '\u4e00' <= i <= '\u9f55':
str5 += i
print(str4) #jhdjfdkjhg
print(str5) #我喜欢美女
练习:小写字母变成大写
str3 = 'jhdjfdk,我喜欢jhg美女MP'
str4 = ''
for value in str3:
if 'a' <= value <= 'z':
str4 += chr(ord(value) - 32)
else:
str4 += value
print(str4) # J HDJFDK,我喜欢JHG美女MP
4.in 和 not in
字符 in 字符串 – 判断 字符串中是否有指定的字符
字符串1 in 字符串2 --判断 字符串2中是否包含字符串1