字符串相关问题
1.凯撒密码
1 描述: 2 凯撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符 3 循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下: 4 5 原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 6 密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 7 8 对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26 9 10 上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26 11 12 假设用户可能使用的输入仅包含小写字母a~z和空格,请编写一个程序,对输入字符串进行凯撒密码加密, 13 直接输出结果,其中空格不用进行加密处理。使用input()获得输入。 14 15 16 输入: 17 python is good 18 输出: 19 sbwkrq lv jrrg
代码实现:
1 # 转换字符 2 def change(c, i): 3 c = c.lower() 4 num = ord(c) 5 if num >= 97 and num <= 122: 6 num = 97 + ((num - 97) + i) % 26 7 return chr(num) 8 9 10 # 输入字符串并转换字符串 11 def kaisa_jiami(): 12 s = input("") 13 s_new = "" 14 15 for i in range(len(s)): 16 s_new += change(s[i], 3) 17 18 print(s_new) 19 20 21 kaisa_jiami()
2.格式化输出
1 name = input("name: ") 2 age = int(input("age: ")) 3 job = input("job: ") 4 hometown = input("hometown: ") 5 6 infos = """ 7 ----------- info of %s ---------- 8 Name: %s 9 Age: %d 10 Job: %s 11 Hometown: %s 12 ---------- end ------------------ 13 """ % (name, name, age, job, hometown) 14 15 print(infos)
1 # __author__ = "wyb" 2 # date: 2018/4/15 3 # 进度条 4 5 import time 6 scale = 50 7 print("执行开始".center(scale//2, "-")) 8 # 计算开始时间 9 start = time.time() 10 for i in range(scale+1): 11 a = '*' * i 12 b = '.' * (scale - i) 13 # 计算执行的比例 14 c = (i/scale)*100 15 # 计算进过的时间 16 dur = time.time() - start 17 # 输出进度条 18 # \r表示不换行继续在此行输出,并且此时的输出将覆盖前面的输出 19 print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end='') 20 # 程序休眠0.1秒 21 time.sleep(0.1) 22 print("\n"+"执行结束".center(scale//2, '-'))
3.检测重复单词
1 需求: 2 一段英文文本,其中有两个单词连续重复了2次,编写程序检查重复的单词并只能保留一个 3 例如: 文本内容: This is is a desk 输出内容: This is a desk
解决思路1: 先分割字符串提取出每一个单词,再检测是否有字符重复并取出重复的字符,最后删除重复的字符串(保留一个)(最后使用两层循环)
1 str = input(">>>") 2 3 # 分割字符串-》把字符串中的单词提取出 4 s = str.split() 5 print(s) 6 7 # 检查是否有字符重复并取出重复的字符 8 res = [] 9 for i in range(len(s)-1): 10 if s[i] == s[i+1]: 11 if s[i] not in res: 12 res.append(s[i]) 13 14 print(res) 15 16 # 删除重复的字符(保留一个) 17 r = [] 18 for i in res: 19 count = 0 20 for j in s: 21 if j == i and count == 0: 22 count += 1 23 r.append(j) 24 elif j == i and count != 0: 25 count += 1 26 else: 27 r.append(j) 28 29 print(r) 30 31 for i in r: 32 print(i, end=" ")
注: 以上代码存在bug,当输入为This is is a desk a a a时输出错误!bug产生的原因是如果有多个单词重复的话,就会遍历单词字符串多一遍
解决思路2: 先分割字符串提取出每一个单词,再检测是否有字符重复并取出重复的字符,最后删除重复的字符串(保留一个)(最后使用一层循环)
1 str = input(">>>") 2 3 # 分割字符串-》把字符串中的单词提取出 4 s = str.split() 5 # 分割字符串后的结果: 6 print(s) 7 8 # 检查是否有单词重复并取出重复的单词 9 res = [] 10 for i in range(len(s)-1): 11 if s[i] == s[i+1]: 12 if s[i] not in res: 13 res.append(s[i]) 14 # 输出重复的单词 15 print(res) 16 17 # 删除重复的字符(保留一个) 18 r = [] 19 20 count = 0 21 for j in s: 22 if j in res and count == 0: 23 r.append(j) 24 count = 1 25 elif j in res and count == 1: 26 continue 27 else: 28 r.append(j) 29 count = 0 30 31 # 输出最后的结果: 32 for i in r: 33 print(i, end=" ")
4.统计字符
1 # __author__ = "wyb"
2 # date: 2018/3/16
3
4 import string
5 import random
6
7 x = string.ascii_letters + string.digits + string.punctuation #包括小写大写字母和符号
8 print(x)
9 y = [random.choice(x) for i in range(100)] # 随机在x中选择100个字符
10 print(y)
11 z = ''.join(y) # 连接可迭代序列中的每个字符串
12 print(z)
13 d = dict()
14 for ch in z:
15 # 如果ch不在字典中,自动创建并赋值为1,然后加一,存在则直接把值加一
16 d[ch] = d.get(ch, 0) + 1
17
18 print(d)
5.去掉字符串中的空格
(1)去掉开头和结尾的空格
1 >>> s = " abcdefghyjklmn "
2 >>> s = s.strip()
3 >>> s
4 'abcdefghyjklmn'
(2)去掉字符串中间的空格
1 >>> s = " 123 666 888 999 "
2 >>> s = ''.join(s.split())
3 >>> s
4 '123666888999'
too young too simple sometimes native!