专栏首页技术进阶之路Python:将给定字符串中的大写英文字母按以下对应规则替换

Python:将给定字符串中的大写英文字母按以下对应规则替换

问题描述

输入样例:
Only the 11 CAPItal LeTtERS are replaced
输出样例:
Only the 11 XZKItal OeGtVIH are replaced

解题思路

首先想到的是使用字典匹配字符然后遍历替换,其次想到的是使用ASCLL码,后者更为方便简单。

思路一

inp = input()
dist = ['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']
for i in inp:
    if i in dist:
        index = dist.index(i)
        inp = inp.replace(i, dist[-index - 1])
print(inp)

思路二

str = input()

for i in str:
    num = ord(i)  # 得到ASCII码
    if (65 <= num <= 90):  # 如果是大写字母
        str = str.replace(i, chr(155 - num))

print(str)

遇到的问题:

在思路二中,我之前的代码是这样的:

str = input()


def replace(str):
    for i in str:
        num = ord(i)  # 得到ASCII码
        if (num >= 65 & num <= 90):  # 如果是大写字母
            i = chr(155 - num)
    return str


replace(str)
print(str)

后来意识到 i 只是一个变量,转瞬即逝,我并没有把它存住。

然后想到的用 replace()函数:

str = input()

for i in str:
    num = ord(i)  # 得到ASCII码
    if (65 <= num <= 90):  # 如果是大写字母
        str.replace(i, chr(155 - num))

print(str)

但是还是不对,因为我没有存储 replace()函数的返回值,导致虽然替换了,但是没有存储它,所以结果没有变化。

最终的代码就是上的那个了,看起来完美无缺,但是全部都是做的,为什么?

输入:
Only the 11 CAPItal LeTtERS are replaced
输出:
Only the 11 XZKItal OeGtVIH are replaced

可以看到除了第一个 O 之外其他的都对,那为什么 O 没有换呢?

其实它换了,只是换了两次,负负得正,又回来了。

因为 replace()方法会把字符串中所有符合条件的字母替换掉。

比如输入 OL ,我们想要的结果为 LO,但上述代码实际上输出的是 OO;

  • 第一次循环把 O 替换成了 L ,此时字符串为 LL;
  • 第二次循环,把所有的 L 都替换成了 O,所以输出结果为 OO。

解决方案:

首先想到的是定义一个对象存储当前的值和一个标记,替换之前先看它是否被访问过了,如果被访问过了就跳过。

还有一种方法就是拼接字符串,让 replace 方法只作用于当前字符。

最终答案

str = input()
newStr = ''
for i in str:
    num = ord(i)  # 得到ASCII码
    if (65 <= num <= 90):  # 如果是大写字母
        i = i.replace(i, chr(155 - num))
    newStr += i

print(newStr)

还有更简单的方法:

str = input()
newStr = ''
for i in str:
    if i.isupper():
        newStr += chr(155 - ord(i))
    else:
        newStr += i
        
print(newStr)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 链表中的指针到底是啥 ?

    你就记住上面出现所有的字段都是变量,都是指针,我们操作他们实际上就是移动指针,改变他们指向的内存地址。

    wsuo
  • Spring 中控制 Bean 生命周期的几种方式及 BeanPostProcessor 执行原理

    这两个类都是接口,其中 InitializingBean 有一个抽象方法 afterPropertiesSet ,DisposableBean 有一个抽象方法 ...

    wsuo
  • Vue 项目报错:‘$‘ is not defined ( no-undef )

    报错如上图所示,错误原因是不认识 $ 符,他是 JQuery 中得符号,我也确实引入了 JQuery:

    wsuo
  • 【Codeforces】1230B - Ania and Minimizing

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    喜欢ctrl的cxk
  • php字符串和0比较,比较都默认转换为0? 原

    if($str==0),字符串和数字比较是否相等, 相当于 把$str 字符串隐性转换为数字,然后再比较,相当于 if( intval($str) == 0 )...

    lilugirl
  • 逆转字符串

    逆转字符串——输入一个字符串,将其逆转并输出 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #inc...

    _gongluck
  • HDU - 2024 C语言合法标识符

    C语言标识符是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义,标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数...

    种花家的奋斗兔
  • 价值一个亿的人工智障代码(C++)

    英雄爱吃土豆片
  • xss防御

    XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故...

    听城
  • C#截取指定字符串函数

    本文转载:http://www.cnblogs.com/liufei88866/archive/2012/05/12/2497395.html

    跟着阿笨一起玩NET

扫码关注云+社区

领取腾讯云代金券