快速且Python式地确定字符串是否为回文的方法

2023-12-23

[编辑:正如有人指出我不正确地使用了回文概念,现在我已经使用正确的函数进行了编辑。我还在第一个和第三个示例中做了一些优化,其中 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 语句在第一个不同的元素处中断,但我不认为这是一种优雅且Python式的方法

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

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


所以,我决定只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速度稍微快一些,但这两个函数显然都优于其他函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速且Python式地确定字符串是否为回文的方法 的相关文章

随机推荐

  • 将文本搜索 where 子句添加到 SPARQL 查询

    我得到了一个我认为是简单的任务 获取现有的 SPARQL 查询并调整 WHERE 子句以将结果限制为特定文本字段包含特定搜索词的实体 但是 我对 SPARQL 语言完全陌生 我尝试过的任何方法都不起作用 看来我需要使用text query
  • spring 环境特定的 log4j 配置

    我正在使用传统方式加载 log4j xml
  • 使用自定义 KMS 密钥访问 AWS 参数存储值

    我正在尝试使用 java 从参数存储中读取 AWS 参数 我已使用自定义加密密钥创建了参数 我在互联网上没有看到使用自定义 KMS 密钥的示例代码 下面是我当前正在运行的代码 这里我们使用默认的 KMS 密钥 AWSSimpleSystem
  • 使用 PHP 仅获取除法的余数

    我正在划分19 5我在哪里用过19 5但我无法得到剩余的only 我如何得到它 谢谢 让 echo 19 5 应返回 4 即 19 5 的余数 3 rem 4 不需要使用下限 因为模运算的结果始终是整数值 如果您在处理浮点值时想要余数 那么
  • iOS - 请求在初次拒绝后启用推送通知

    我想知道在最初拒绝后是否可以从应用程序内强制弹出 XXXXX 想向您发送推送通知 用例如下 用户安装应用程序 获取有关推送通知的警报 并拒绝 因为他们还不知道 信任该应用程序 他们使用该应用程序并主动在应用程序内请求收到警报 当某事发生时
  • 如何去除应用栏上方的阴影?

    我想通过添加使状态栏透明
  • 使用 Eclipse 和 Tomcat 的 JSF 2.0 教程 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取一段文本中最后一行的宽度

    是否可以以某种方式测量具有多个中断 回车的段落中最后一行文本的长度 Morbi leo risus porta ac consectetur ac vestibulum at eros Donec id elit non mi porta
  • 如何在 Midnight Commander 中使用 panelize?我想知道,因为这是对选定文件和目录进行递归 chmod 的一种方法

    我知道我可以使用 chmod 和高级 chmod 但他们没有为我提供一种方法递归地更改文件和文件夹的权限 Panelize 似乎能够做到这一点 但是 如果我使用 Ctrl t 选择文件然后选择 panelize 我似乎没有得到任何结果 我不
  • F# 记录与 .net 结构

    f 记录与 net 结构相同吗 我看到人们谈论 f 结构 他们使用这个术语可以与 F 记录互换吗 像FSharp 运行我的算法比 Python 慢 https stackoverflow com questions 5850243 fsha
  • 如何在 Java 中更改客户端 TLS 首选项?

    我正在尝试向 Java 中的端点发出 POST 请求 当我尝试发送请求时 出现以下错误 Caused by javax net ssl SSLHandshakeException The server selected protocol v
  • 让 Eclipse 使用 src/test/resources 而不是 src/main/resources

    我正在 Eclipse 中编写一个小型 Maven 应用程序 我将一些属性文件和应用程序上下文存储在目录 src main resources 中 我现在想让 Eclipse 使用 src test resources 目录中的属性 所以当
  • 在三元条件下抛出新的异常[重复]

    这个问题在这里已经有答案了 我有这行代码 List
  • C# 十进制的类型后缀

    我不知道我想要实现的目标的正确措辞是什么 因此它可能已经发布在网上 如果是的话请善待 好吧 基本上我有这个方法 public static T IsNull
  • Docker-compose 在运行时使用 NGINX 扩展 Jetty

    我是码头工人的新手 我已经完成了一些教程来创建 docker compose 文件来创建 3 个 Jetty 1 个 NGINX 和 1 个 MySQL NGINX 充当具有循环机制的 LB 它按预期工作良好 如果我扩展我的jetty实例
  • Java NIO:IOException:损坏的管道是什么意思? [复制]

    这个问题在这里已经有答案了 对于我的一些 Java NIO 连接 当我有SocketChannel write ByteBuffer 调用 它会抛出一个IOException 管道破损 是什么导致 管道破裂 更重要的是 是否有可能从该状态恢
  • iBeacons:如果应用程序在后台,locationManager:didEnterRegion:仅在锁屏显示时调用

    我正在开发一个监视 iBeacon 区域的 iOS 应用程序 当应用程序在后台运行时 我希望它在遇到特定的 iBeacon 区域时发送本地通知 一切工作正常 除了一件事 locationManager didEnterRegion 显然不会
  • 绘制植物雌性和雄性性相持续时间

    我很难弄清楚如何我们可以创建一个折线图 其中 Y 轴和 X 轴上都有单个植物一条连续的线分为植物各自的开放期 性期和枯萎期 我有大约 60 株植物 每株都有 5 到 15 朵花 以及它们各自的开放日期 进入雄性阶段的日期 进入雌性阶段的日期
  • 配置 log4j 在运行时记录到自定义文件

    任何人都可以指导我如何配置 log4j 以记录到我在运行时指定的特定文件 日志文件的名称和路径是在运行时生成的 应用程序必须记录到该特定文件 通常 log4j properties 文件中的文件附加器条目指向应用程序将使用的日志文件 但是在
  • 快速且Python式地确定字符串是否为回文的方法

    编辑 正如有人指出我不正确地使用了回文概念 现在我已经使用正确的函数进行了编辑 我还在第一个和第三个示例中做了一些优化 其中 for 语句一直运行到到达字符串的一半 我为检查字符串是否为回文的方法编写了三个不同版本的代码 该方法作为类 st