Day8-字符串

复习

enumerate()可以用for来代替 --验证
素数打印用for…for
在这里插入图片描述

二维列表

  • 一个列表的元素是列表
  • 遍历二维列表使用二重循环
    在这里插入图片描述
    、
    在这里插入图片描述

元组(有序序列,按下标访问,元素不能修改)

在这里插入图片描述
t2=(1)定义的是整数
t2=(1,)定义的才是Tuple
元组列表互相转化:list() tuple()

序列解包

元组解包

t1 = (1,2)
a,b = t1 # a=1,b=2 元组解包把第一个元素赋给a,第二个元素赋给b
t2 = 1,3 # 相当于元组定义,t2=(1,3)

列表解包

a,b,*=[10,20,30,40]
print(a,b,
) # 10,20,[30,40]
a,b = [10,20] #a=10,b=20

字符串解包

a,b = “ab” # a=“a”, b=“b”

字符串-- 没有字符,只有字符串

创建字符

  • ‘abc’,“abc”,’’‘abc ‘’’
  • str([10,20,30] #将列表转换成"[10,20,30]"字符串

原生字符 r" "

函数

  • str.count(sub,start=0,end=len(str)) # str.count(“a”,0,5)
  • str.find(sub,start=0,end=len(str)) # str.find(“a”,0,5) 找到第一个下标,找不到就会返回-1
  • str.index(sub,start=0,end=len(str)) # str.find(“a”,0,5) 找到第一个下标,找不到就会报错 ValueError: substring not found
  • str.replace(old,new,[count]) #代替字符
  • str.split(sep,num) #字符串拆分成列表,用num个分割符
  • str.splitlines([keepends]) #拆分包含多行的字符串,keepends=True或者非零整数表示保留换行符\n
  • str.join(seq) #使用字符串str将seq(列表\字符串等)连接起来
  • str.isalpha() #

在这里插入图片描述
str.isalpha()和str.isalnum()都不好用,不能避免汉字
str.isdigit(),str.isdecimal(),str.isnumerice()常用

字符格式化

  • 用%格式化
    print(“大家好,我叫%-s,今年%d岁了,体重%-10.2f公斤” % (“王大壮”,16,18.7))
  • 用format格式化
    在这里插入图片描述
tp1 = "i am {:s}, age{:>10,d},height{:>10f},mondey {:<9,d}".format("Lily",18,1.71,1111111111)

字节与字符

创建字节

b1 = b’abc’
b2 = bytes(“abc”,“utf8”)

字符串转字节

s1 = “abc”
s2 = s1.encode(‘utf-8’) #转成字节
s2.decode(“utf-8”) #字节转成字符串

作业

1、字符串填空

  1. 已知s2 = ‘123’,则:s2 * 3 = “123123123”_______; s2 + str(456) = “123456”_______;
  2. 已知s1 = ‘123456789’。则:s1[:3] = "123"; s1[-5:] = __“56789”; s1[::2]="13579"__; s1[::-3] = “963”_____; int(s1[3:5]) + int(s1[-5:3:-1]) = 50____。
  3. 已知s1 = “this is a test of Python”;统计字符串串中s出现的次数:3____;
    取出子串”test”的表达式:s1.find(“test”);
    获取s1的反序字符串:
    s1[::-1];
    将子串”test”替换为”exam”:s1.replace(“test”,“exam”)
  4. 已知字符串a = “aAsmr3idd4bgs7Dlsf9eAF”,要求如下:将a字符串的大写改小写,小写改为大写:___a.swapcase()___;转为⼩小写字符串串:a.lower()_______。
  5. 已知x=“abc”,y=“def”,z=[“d”,“e”,“f”], 则x.join(y)= "dabceabcf";
    x.join(z) = "dabceabcf"
    ______________。
  6. 把s1=”你好”,编码为字节流字符串串:s1.encode(“utf8”)_____
  7. 已知字符串串:s2 = ‘ bj1902 ’,去除s2左边的空格:s2.lstrip()_______;去除s2右边的空格:___s2.rstrip()___;去除s2两边的空格:s2.strip();
  8. 定义变量量s=‘abcde’,
    写出下列列代码运⾏行行的结果
    s.upper() “ABCDE”____________
    s[2::-1] "cba"________
    s.isdigit() False__________
    s * 2 "abcdeabcde"________
    '’.join(list(s)[:3]) __"ab*c"______________

2、作业:

初级

# 初级
#1. 输入⼀个字符串,⾃⼰统计该字符串有多少个字符,不允许用len函数
s1_1 = input("请输入一个字符串:")
i_1 = 0
for x in s1_1:
    i_1 += 1
print(i_1)

# 2.任给一个字符串,请验证是否是手机号,手机号为11位数字,开头三位必须是130,151,186

if s2 in list1:
    if s1.isdigit() and len(s1) == 11:
        print("这是一个合法的手机号码。")
    else:
        print("这是一个不合法的手机号码。")
else:
    print("这是一个不合法的手机号码。")
# 修正答案如下,只需4行,逻辑更清晰。
if s2 in list1 and s1.isdigit() and len(s1) == 11:
	print("这是一个合法的手机号码.")
else:
	print("不合法")


# 3.将字符串串’1234567890’转换成‘ 1,234,567,890’输出,每3位⽤用逗号隔开。
a = int("1234567890")
# print("{:,d}".format(a))
fm = "{:,d}"
print(fm.format(a))

# 4.输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
s1 = "abcefghijk"  # 原字符串
s2 = "agw"    # 要删除的字符
list1 = list(s1)      # 将字符串转化成列表才能删除
for s in s2:           # 遍历s2的所有字符
    if s in s1:          # 如果s2的字符在原字符串才执行删除
        list1.remove(s)
print("删除后的字符串是:", "".join(list1))
# 字符串可以使用replace将要删除的字符代替成"",输出即可,这样不用先转变成list

# 5.任意输入⼀段⽂字,统计有多少个单词(用空格隔开)、多少个数字、多少字⺟、多少空格。
s = "A bird in the hand is worth 2 in the wood."
words = len(s.split(" "))     # 用空格分隔成列表,再计算列表元素个数
print("共有%d个单词" % words)
# print("共有%d个单词" % (s.count(" ")+1))   #空格数量+1
num, letters, space = 0,0,0   # 数字,字母,空格的数量
for letter in s:                # 遍历字符串
    if letter.isdigit():         # 统计数字的数量
        num += 1
    if letter.isalpha():        # 统计字母的数量
        letters += 1
    if letter == " ":           # 统计个空格的数量
        space += 1
print("共有%d数字,%d字母,%d空格" % (num, letters, space))

# 6. 已知字符串a = "aAsmr3idd4bgs7Dlsf9eAF",要求如下:
# a.将a字符串的数字取出,并输出成一个新的字符串
# b.请统计a字符串出现的每个字母的出现次数(忽略⼤小写,a与A是同⼀个字母),并输出成一个字典。例{'a':4,'b':2}
# c.输出a字符串串出现频率最⾼的字母
# d.请判断'boy'⾥出现的每⼀个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输出False

a = "aAsmr3idd4bgs7Dlsf9eAF"
# -----------a.-------------
b = []
for x in a:
    if x.isdigit():
        b.append(x)
print("".join(b))  
# 标准答案是使用字符串拼接的方法  
digit = ""
for x in a:
    if x.isdigit():
		digit += x
print(digit)

# -----------b.------------
b = a.lower()
result = {x: b.count(x.lower()) for x in b if not x.isdigit()}
print(result)
# -----------c.------------
s1 = [value for value in result.values()]
# 此处也可以:
# s1 = result.values()
max = {x:y for x,y in result.items() if y == max(s1)}
print(max)
# ++++++++++++++++  d.+++++++++++++++++++++++++++++++++++++
c = "boy"
list = []
for x in c:
    if x in a:
        list.append(True)
    else:
        list.append(False)
print(list)
# for x in c:
#  	  if x not in a:
#  	     print(false)
#  	  	 break
# else:
#  	 print(True)          #for...else 前面不满足,就else
# ++++++++++++++ e. ++++++++++++++
d = {False for x in c if x not in a}   # 有不在a字符串的字母生成False集合
if False in d:
    print(False)
else:
    print(True)

中级

# ---coding:utf-8----
# 文件名: 作业(中级).py
# @Time:2020/1/20 20:53
# 1.input函数每次只能输入一个字符串,请实现如下输入格式:1,20,30 。然后
# 将获得的字符串分割,得到:三个整数:1 20 30,然后赋值给三个变量。
# no1_input = input("请输入一个字符串,形如1,20,30:")
# no1_a, no1_b, no1_c = [int(no1_x) for no1_x in no1_input.split(",")]  # 列表推导式转为整数并赋值给三个变量
# print(no1_a, no1_b, no1_c)

#2.求字符串最后一个单词的长度,单词之间用空格分割。
no2_str = "A bird in the hand is worth two in the bush"
no2_a,*_, no2_b = no2_str.split(" ")        #列表解包,最后一个单词赋给变量no2_b
print(len(no2_b))  # 计算单词长度


#3.输⼊一个字符串,压缩字符串如下aabbbccccd变成a2b3c4d1
no3_str = "aabbccdddd"
no3_str2 = []
no3_keys = {no3_x:str(no3_str.count(no3_x)) for no3_x in no3_str}
for no3_x, no3_y in no3_keys.items():
    no3_str2.append(no3_x)
    no3_str2.append(no3_y)
print("".join(no3_str2))

# 4.给定一个句子(只包含字母和空格),将句子中的单词位置反转,单词用空
# 格分割, 单词之间只有一个空格,前后没有空格。例如:“hello xiao mi”-> “mi xiao hello”
no4_str = "A bird in the hand is worth two in the bush"          #原字符串
# result1 = {x:y for x,y in enumerate(no4_str.split(" "))}          #
no4_result1 = [x for x in no4_str.split(" ")]
#print(no4_result1)
no4_list = []
for aa in range((len(no4_str.split(" "))-1),-1,-1):
    no4_list.append(no4_result1[aa])
print(" ".join(no4_list))
#用reverse()函数就很简单:
#a = no4_str.split(" ")
#a.reverse()
#c = " ".join(a)
#print(c)
# 5.将s = “ajldjlajfdljfddd",去重并从小到大排序输出"adfjl"
s = "ajldjlajfdljfddd"
no5_result = {x for x in s}                      # 集合去重
no5_result_list = [x for x in no5_result]          # 集合转化成列表,以便按顺序排列
# 以上两行用 no5_result = list(set(s))
no5_result_list.sort()
print("".join(no5_result_list))

# 6.使⽤用密码表加密
# 密码表加密是一种⼗十分常⽤用的密码加密⽅方法,加密的原理理是根据明⽂文和密码表,加密形成密⽂文,根据密⽂文和
# 密码表解密,读出明⽂文。密码表可以是如下表所示:
# ⾃自⼰己设计密码表,任意输⼊入⼀一个字符串串,然后显示其密⽂文。运⾏行行输⼊入如下所示:
no6_text = "abcdefghijklmnopqrstuvwxyz1234567890"
no6_encry = "18ac4y7bxuiep23hjs5ofwv0zdl9gkm6nqrt"
no6_dict = {x:y  for x,y in zip(list(no6_text), list(no6_encry))}
no6_input_text = input("请输入一串字符串:")
no6_output_text = [no6_dict[x] for x in no6_input_text]
print("".join(no6_output_text))
#答案:将明文和密文放在一个二维列表中,根据第一个列表找第二个列表
# t = ["abcdefghijklmnopqrstuvwxyz1234567890","18ac4y7bxuiep23hjs5ofwv0zdl9gkm6nqrt"]
# s = input("请输入要加密的字符串:")
# result = ""
# for ch in s:
#     if ch in t[0]:
#         result += t[1][t[0].index(ch)]
# print(result)

选做

# 凯撒密码
a = "Rqfh pruh lqwr wkh euhdfk,ghdu iulhqgv,rqfh pruh;Ru forvh wkh zdoo xs zlwk rxu Hqjolvk ghdg. \
Lq shdfh wkhuh'v qrwklqj vr ehfrphv d pdq Dv prghvw uwlooqhvv dqg kxplolwb: \
Exw zkhq wkh eodvw ri zdu eorzv lq rxu hduv, Wkhq lplwdwh wkh dfwlrq ri wkh wljhu; \
Vwliihq wkh vlqhzv,vxpprq xs wkh eorrg."
# a = {x:a.count(x) for x in "".join(a.split(" "))}   #最多的字母为e,但显示是h,可推断两个字母相差3个ascII码
b = [x for x in a]
c = []
for x in b:
    if ord(x) == 44:
        c.append(",")
    if ord(x) == 32:
        c.append(" ")
    elif ord(x) == 59:
        c.append(";")
    elif ord(x) == 46:
        c.append(";")
    elif ord(x) == 58:
        c.append(":")
    elif ord(x) == 39:
        c.append("'")
    else:
        c.append(chr((ord(x) - 3)))
print(" ".join(c))

待解决问题

凯撒密码的解法

字符串作业

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值