Day 8—字符串
复习
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、字符串填空
- 已知s2 = ‘123’,则:s2 * 3 = “123123123”_______; s2 + str(456) = “123456”_______;
- 已知s1 = ‘123456789’。则:s1[:3] = "123"; s1[-5:] = __“56789”; s1[::2]="13579"__; s1[::-3] = “963”_____; int(s1[3:5]) + int(s1[-5:3:-1]) = 50____。
- 已知s1 = “this is a test of Python”;统计字符串串中s出现的次数:3____;
取出子串”test”的表达式:s1.find(“test”);
获取s1的反序字符串:
s1[::-1];
将子串”test”替换为”exam”:s1.replace(“test”,“exam”) - 已知字符串a = “aAsmr3idd4bgs7Dlsf9eAF”,要求如下:将a字符串的大写改小写,小写改为大写:___a.swapcase()___;转为⼩小写字符串串:a.lower()_______。
- 已知x=“abc”,y=“def”,z=[“d”,“e”,“f”], 则x.join(y)= "dabceabcf";
x.join(z) = "dabceabcf"______________。 - 把s1=”你好”,编码为字节流字符串串:s1.encode(“utf8”)_____
- 已知字符串串:s2 = ‘ bj1902 ’,去除s2左边的空格:s2.lstrip()_______;去除s2右边的空格:___s2.rstrip()___;去除s2两边的空格:s2.strip();
- 定义变量量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))