【Python】告别C语言思维,用更 Pythonic 的方式解决字符串处理与字典映射
题目描述
给定 n 个服务器的名称与 IP 地址映射,以及 m 条包含 IP 地址的 Nginx 配置命令。你需要根据命令中的 IP 地址,查找到对应的服务器名称,并将其作为注释追加到每条命令的末尾。
输入格式:
- 第一行包含两个整数
n和m(1 <= n, m <= 1000),分别表示服务器的数量和命令的数量。 - 接下来的
n行,每行包含两个字符串name和ip,用空格隔开,代表服务器名称和 IP 地址(保证所有 IP 唯一)。 - 接下来的
m行,每行是一条配置命令,格式为command ip;(注意 IP 末尾自带一个分号)。保证命令中的 IP 一定在前面的列表中存在。
输出格式:
- 依次输出处理后的
m条命令。 - 每条命令按原样输出,并在末尾追加
#name,其中name是该 IP 对应的服务器名称。
样例输入:
1 | 2 2 |
1 | 3 5 |
样例输出:
1 | block 192.168.0.1; #replica |
1 | redirect 138.197.64.57; #server |
代码实现
1 | a,b = map(int, input().split()) |
存在两个可以改进的点
- 遍历列表查找字典值对应的键,丧失了字典的“查找”特点,写for循环很C
- 用split处理字符串的时候不够优雅,很C
改进方案
1 | a,b = map(int, input().split()) |
创建字典的时候,交换了键和值的位置,方便后续查找
对于split处理,在Python中有一下几种方式:
方案一:使用 rstrip()(最推荐,安全且语义清晰)
rstrip() 的作用是去掉字符串**右侧(末尾)**的指定字符。
1 | # 我的写法 |
为什么好? 它的可读性极强,代码直接翻译过来就是“从右边剥离分号”。而且它很安全:如果字符串末尾没有分号,它什么也不会做,原样返回;
如果有多个分号(比如 192.168.0.1;;),它会一起剥离干净。
方案二:使用切片 [:-1](最常用,老司机的肌肉记忆)
如果你百分之百确定这个字符串的最后一个字符一定是分号,直接一刀切掉最后一个字符是最爽快的。
1 | # Pythonic 写法 |
为什么好? 这是 Python 独有的“切片”魔法。:-1 表示“从开头一直取到倒数第一个字符(不包含倒数第一个)”。它执行速度极快,代码极简。缺点是如果格式不规范(比如末尾碰巧没分号),它会错误地把 IP 的最后一位数字给切掉。不过对于这道算法题来说,题目保证了格式,所以用切片完全没问题。
方案三:使用 removesuffix()(Python 3.9+ 专属,最精确)
这是 Python 3.9 之后专门为了“去掉后缀”加入的新方法。
1 | # Pythonic 写法 |
为什么好? 它比 rstrip() 更严格。rstrip(';') 会去掉末尾所有的分号,而 removesuffix(';') 只会把 ';' 作为一个整体后缀去掉一次。它的语义是所有方案里最精准的。
所以后面部分可以改为
1 | for _ in range(b): # 如果变量 i 用不到,Python 里习惯用下划线 _ 代替 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 王总的博客!



