[编辑:正如有人指出我错误地使用了回文概念,现在我已经用正确的函数进行了编辑。我还对第一和第三个示例进行了一些优化,在这两个示例中,for语句执行到字符串的一半位置]
我编写了三种不同版本的方法来检查字符串是否为回文。这些方法被实现为类“str”的扩展。
这些方法还会将字符串转换为小写,并删除所有标点符号和空格。哪个更好(更快,更符合Python规范)?
以下是这些方法:
1) 这是我想到的第一个解决方案:
def palindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
n = len(lowerself)
for i in range(n//2):
if lowerself[i] != lowerself[n-(i+1)]:
return False
return True
我认为第一种方法更快,因为它没有字符串的转换或反转,并且for循环语句在遇到第一个不同的元素时就会终止。但我不认为这是一种优雅和pythonic的方式。
第二种方法中,我使用了在stackoverflow上找到的解决方案,即使用高级切片string[::-1]进行转换。
# more compact
def pythonicPalindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
lowerReversed = lowerself[::-1]
if lowerself == lowerReversed:
return True
else:
return False
但我认为切片和字符串比较会使这个解决方案变慢。
3) 我想到的第三种解决方案是使用迭代器:
# with iterator
def iteratorPalindrom(self):
lowerself = re.sub("[ ,.;:?!]", "", self.lower())
iteratorReverse = reversed(lowerself)
for char in lowerself[0:len(lowerself)//2]:
if next(iteratorReverse) != char:
return False
return True
我认为这种解决方案更为优雅,比第一种解决方案更高效,比第二种解决方案更简单。
timeit
模块是您的好帮手。 - bruno desthuilliersstr
子类的方法是完全不符合 Python 风格的 - 在这里使用纯函数才是 Pythonic 的方式。 - bruno desthuilliersall(map(operator.eq, lowerself, reversed(other)))
。 - GingerPlusPlus