2020-09-29集合和字符串及作业

day7-集合和字符串

集合
  1. 什么是集合

    集合是容器型数据类型,将{}作为容器的标志,里面多个元素用逗号隔开:{元素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
    
  2. 集合的增删改查

    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炫舞'}
  1. 数学集合运算

    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))
    
    
  1. 什么是字符串(str)

    字符串是容器型数据类型,将‘’、“”、“”“”“”、‘’‘’‘作为容器的标志,里面的每一个基本符号就是字符串的元素

    字符串是不可变的(不支持增删改);字符串是有序的(支持下标)

    元素:引号里面的每个基本单元就是字符串的元素,又叫字符(一般使用长度为1的字符串来表示字符)

    # 空串
    s1 = ''
    s2 = ""
    s3 = ''''''
    s4 = """"""
    print(type(s1))  # # <class 'str'>
    
    # 字符串是有序的
    print('abc' == 'bac') # False
    
  2. 字符

    1)转义字符:

    在特定的一个或者多个符号前加 \ 让符号具有特殊功能和特殊意义;那么这种带有\ 的字符就是转义字符

    转义字符 特殊功能和特殊意义
    \n 换行
    \t 水平制表符
    \' 表示一个普通的单引号
    \" 表示一个普通的双赢号
    \\ 表示一个普通反斜杠
    注意: 任意一个转义字符的长度都是1

2)普通字符:

除了转义字符以外的字符都是普通字符,普通字符在字符串中表示这个符号本身。

  1. 字符的编码

    编码:计算机在存储数据的时候只能存数字(存数字二进制补码),为了能够让计算机存储字符,我们给每一个字符都对应一个数字,那么这个对应的数字就是这个字符的编码值

    字符编码表 - 记录字符和数字之间一一对应关系的表就是字符编码表

    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.获取字符:字符串获取字符和列表获取元素方法一样

    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. 输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)

    例如: 输入'abcd1234 ' ** 输出'bd24'**

    char = 'abcd1234'
    print(char[1::2])  # bd24
    
  2. 输入用户名,判断用户名是否合法(用户名长度6~10位)

    user_name = input('输入用户名:')
    if 6 <= len(user_name) <= 10:
        print('合法')
    else:
        print('不合法')
    
  3. 输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)

    例如: '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('合法')
    
  4. 输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)

    例如: '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('合法')
    
  5. 输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串

    例如:输入'abc1shj23kls99+2kkk' 输出:'123992'

    char = 'abc1shj23kls99+2kkk'
    new_char = ''
    for i in char:
        if '0' <= i <= '9':
            new_char += i
    print(new_char)
    
  6. 输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用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)
    
  1. 输入一个小于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))
    
    
  1. 输入一个字符串,统计字符串中非数字字母的字符的个数

    例如: 输入'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)
    
  1. 输入字符串,将字符串的开头和结尾变成'+',产生一个新的字符串

    例如: 输入字符串'abc123', 输出'+bc12+'

    char = 'abc123'
    print(char.center(len(char)+2,'+'))
    
  1. 输入字符串,获取字符串的中间字符

例如: 输入'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])
  1. 写程序实现字符串函数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. 获取两个字符串中公共的字符

例如: 字符串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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容