要想检查文本是否属于回文需要忽略其中的标点、空格与大小写。例如,“Rise to vote, sir.”是一段回文文本,但是我们现有的程序不会这么认为。你可以改进上面的程序以使它能够识别这段回文吗?(《python简明教程》里“输入与输出”章节的作业练习)。
主要思路:
1.把字符串全部转成小写或全部转成大写,可以用到str.lower()和str.upper()。
2.识别空格和标点符号,若有就跳过或者删除。使用一个元组(你可以在这里找到一份列出所有标点符号的列表)来保存所有需要禁用的字符,然后使用成员资格测试来确定一个字符 是否应该被移除,即 forbidden = ('!' , '?' , '.', ' ...')。可以用到str.remove(obj)。
s2=list(s1)
forbidden = ('!' ,'?' , '.' , '...' ,',' ,)
for i in s2:
if i in forbidden or i ==' ':
s2.remove(i)
3.判断是否为回文。字符串倒置回来的字符串等于原有的字符串。
字符串:
def fanzhuan(text):
return text[::-1]
def is_fanzhuan(text):
return text == fanzhuan(text)
列表:
str3=str2.copy()
str2.reverse()
#str.reverse()是变更str2,会改变str2的值,不返回一个新的值。==也只是令变量指向该对象。所以前面用#s.copy()创造出新的对象。
参考代码:
扫描二维码关注公众号,回复:
4316988 查看本文章
def chuli_str(text):
s1=text.lower()
s2=list(s1)
forbidden = ('!' ,'?','.', '...',',',)
for i in s2:
if i in forbidden or i ==' ':
s2.remove(i)
return s2
def fanzhuan(text):
return text[::-1]
def is_fanzhuan(text):
return text == fanzhuan(text)
str1 = input("please inter your want to input:")
str2=chuli_str(str1)
#第一个方法(用函数实现)
if is_fanzhuan(str2):
print("right")
else:
print("wrong")
"""
#第二个方法
str3=str2.copy()
str2.reverse()
if str3==str2:
print("right")
else:
print("wrong")
"""
不足和解决方法:
1.第一个想法:把所有标点符号全部转化成空格,然后化为字符串。
错误参考代码:
for i in str1:
for i in forbidden:
str1.replace(i ,' ')
不足:
i 执行一次,都会把之前的值覆盖,得出的结果,只有对最后一个值起作用。而且字符串是固定不变,列表是可变的,可以更改内容的。
解决方法:暂时还没解决。
2.第二个想法:首先申请一个空的字符串,遇到不是标点符号或者空格,就往字符串里添加。
错误参考代码:
a=""
for i in str1:
if i not in forbidden and i !=' ':
a+=i
不足:i 执行一次,都会把之前的值覆盖,得出的结果,只有对最后一个值起作用。且用不了a.append()和a.extend()(用于列表之类可变)。
解决方法:用列表来实现
a=[]
for i in s1:
if i not in forbidden and i !=' ':
a.extend(i)
总结:字符串是不可变的,无法改变内容;列表是可变的,可以改变内容。