背景任务
问题来自《简明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.punctuation
strs = rm_target_ch_in_source(strs, punc_en)
punc_zh = punctuation
strs = 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可以正常跑代码
小结
本文尝试实现了忽略其中的标点、 空格与大小写的回文字符串判别,可进一步优化点是,强回文判别底层实现可以用双指针,提高判别效率。
参考资料:
附完整示例代码:
# -*- 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 strs
def check_palindrome_not_strict(strs):
print(strs)
strs = strs.lower() # 全小写
strs = strs.replace(' ', '') # 空格替换
punc_en = string.punctuation
strs = rm_target_ch_in_source(strs, punc_en)
punc_zh = punctuation
strs = rm_target_ch_in_source(strs, punc_zh)
print(strs)
check_palindrome_strict(strs)
return
def 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!')