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.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

测试用例

  1. sir
  2. maam
  3. madam
  4. racecar
  5. Rise to vote, sir.
  6. 你好,好你
  7. 你,是,谁啊?

坑点小结


问题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可以正常跑代码

小结


本文尝试实现了忽略其中的标点、 空格与大小写的回文字符串判别,可进一步优化点是,强回文判别底层实现可以用双指针,提高判别效率。

参考资料:

  1. python 去除所有的中文 英文标点符号
  2. 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 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!')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值