当前位置:  开发笔记 > 编程语言 > 正文

快速和pythonic的方式来找出一个字符串是一个回文

如何解决《快速和pythonic的方式来找出一个字符串是一个回文》经验,为你挑选了1个好方法。

[编辑:有人指出我使用了不正确的palindrom概念,现在我已经编辑了正确的功能.我在第一个和第三个例子中也做了一些优化,其中for语句一直到它达到字符串的一半]

我已经为一个检查字符串是否为回文的方法编写了三个不同的版本.该方法实现为类"str"的扩展

该方法还将字符串转换为小写,并删除所有准时和空格.哪一个更好(更快,pythonic)?

以下是方法:

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的方式

2)在第二个版本中,我使用在stackoverflow上创建的解决方案进行转换(使用高级切片字符串[:: - 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

我认为第一种解决方案更优雅,第二种解决方案效率更高



1> N. Wouda..:

所以,我决定只是timeit,找到哪一个是最快的.请注意,最终功能是您自己的更干净的版本pythonicPalindrome.它的定义如下:

def palindrome(s, o):
    return re.sub("[ ,.;:?!]", "", s.lower()) == re.sub("[ ,.;:?!]", "", o.lower())[::-1]

方法

我为每个函数运行了10个不同的测试 在每次测试运行中,函数被调用10000次,带有参数self="aabccccccbaa", other="aabccccccbaa".结果可以在下面找到.

            palindrom       iteratorPalindrome      pythonicPalindrome      palindrome  
1           0.131656638            0.108762937             0.071676536      0.072031984
2           0.140950052            0.109713793             0.073781851      0.071860462
3           0.126966087            0.109586756             0.072349792      0.073776719
4           0.125113136            0.108729573             0.094633969      0.071474645
5           0.130878159            0.108602964             0.075770395      0.072455015
6           0.133569472            0.110276694             0.072811747      0.071764222
7           0.128642812            0.111065438             0.072170571      0.072285204
8           0.124896702            0.110218949             0.071898959      0.071841214
9           0.123841905            0.109278358             0.077430437      0.071747112
10          0.124083576            0.108184210             0.080211147      0.077391086

AVG         0.129059854            0.109441967             0.076273540      0.072662766
STDDEV      0.005387429            0.000901370             0.007030835      0.001781309

看起来你的清洁版本pythonicPalindrome稍微快一点,但这两个功能明显超出了替代品.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有