字符串相关问题

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'
posted @ 2018-04-12 16:08  woz333333  阅读(728)  评论(0编辑  收藏  举报