Python世界:输入输出之回文串判别实践
Python世界:输入输出之回文串判别实践
- 背景任务
- 实现思路
- 坑点小结
- 小结
背景任务
问题来自《简明Python教程》中的输入与输出一章,作业练习中提出实现:回文字符串判别。
要想检查文本是否属于回文需要。 例如, “Rise to vote, sir. "
本文在其io_input.py
示范代码基础上,实现改进。
实现思路
文件命名为:io_input_is_palindrome.py
,改进功能:
- 支持中英文输入
- 支持强回文和非强回文模式切换
- 非强回文模式指忽略标点符号与大小写
编码思路
- 不动强回文模式基线实现,先复用底层强回文
- 把非强回文要求的字符串转化下,去除冗余字符
- 大小写统一
- 去除冗余空格
- 去除英文标点符号
- 去除中文标点符号
- 输入强回文子函数判别
核心实现逻辑:
def check_palindrome_not_strict(strs):print(strs)strs = strs.lower() # 全小写strs = strs.replace(' ', '') # 空格替换punc_en = string.punctuationstrs = rm_target_ch_in_source(strs, punc_en)punc_zh = punctuationstrs = rm_target_ch_in_source(strs, punc_zh)print(strs)check_palindrome_strict(strs)return
测试用例
- sir
- maam
- madam
- racecar
- Rise to vote, sir.
- 你好,好你
- 你,是,谁啊?
坑点小结
问题1:ModuleNotFoundError: No module named ‘zhon’ from zhon.hanzi import punctuation
原因:未安装zhon库
解决:pip install zhon
问题2:已安装成功,仍报找不到对应模块。
分析:
1、已确认zhon模块有在本地,但是是在aconda环境中
2、在vscode中python解释器选择aconda的python3.6无法使用
解决:跑到aconda的环境中,用spyder可以正常跑代码
小结
本文尝试实现了忽略其中的标点、 空格与大小写的回文字符串判别,可进一步优化点是,强回文判别底层实现可以用双指针,提高判别效率。
参考资料:
- python 去除所有的中文 英文标点符号
- python 字符串去空格
附完整示例代码:
# -*- coding: utf-8 -*-
"""
Created on 240904
功能:判断是否回文字符串
1、支持中英文
2、支持强回文和非强回文模式切换
"""import string # 引用英文标点符号
from zhon.hanzi import punctuation # 引用中文标点符号def reverse(text):return text[::-1]def is_palindrome(text):return text == reverse(text)def print_palindrome_check_result(is_palindrome):if is_palindrome == True:print("Yes, it is a palindrome")else:print("No, it is not a palindrome")def check_palindrome_strict(strs):if is_palindrome(strs):print_palindrome_check_result(True)else:print_palindrome_check_result(False)def rm_target_ch_in_source(strs, target):for ch in target:strs = strs.replace(ch, '')return strsdef check_palindrome_not_strict(strs):print(strs)strs = strs.lower() # 全小写strs = strs.replace(' ', '') # 空格替换punc_en = string.punctuationstrs = rm_target_ch_in_source(strs, punc_en)punc_zh = punctuationstrs = rm_target_ch_in_source(strs, punc_zh)print(strs)check_palindrome_strict(strs)returndef check_palindrome_proc(is_strict_palindrome):input_str = input("Enter text: ")# input_str = "madam"# input_str = "sir"# input_str = "Rise to vote, sir."# input_str = "你好,好你"# input_str = "你好,Y好你??!!!"# input_str = "你,是,谁啊?"if is_strict_palindrome:check_palindrome_strict(input_str)else:check_palindrome_not_strict(input_str)if __name__ == '__main__':print('start!')# 正式运行# is_strict_palindrome = True # 支持强回文模式is_strict_palindrome = False # 不支持强回文模式,忽略标点符号及大小写check_palindrome_proc(is_strict_palindrome)# 正式退出main函数进程,以免main函数空跑print('done!')