PHP具有 strtr功能:
strtr('aa-bb-cc',array('aa' => 'bbz','bb' => 'x','cc' => 'y'));
# bbz-x-y

它将字符串中的字典键替换为相应的值,并且(重要)不替换已替换的字符串.一个天真的尝试在python中编写相同的东西:

def strtr(strng,replace):
    for s,r in replace.items():
        strng = strng.replace(s,r)
    return strng

strtr('aa-bb-cc',{'aa': 'bbz','bb': 'x','cc': 'y'})

返回xz-x-y,这不是我们想要的(bb再次被替换).如何更改上面的函数,使其行为像它的PHP对应?

(如果可能的话,我更喜欢没有正则表达式的答案).

Upd:这里有一些很棒的答案.我计时他们发现,对于短串Gumbo的版本似乎是最快的,在更长的字符串上,赢家是解决方案:

# 'aa-bb-cc'
0.0258 strtr_thg
0.0274 strtr_gumbo
0.0447 strtr_kojiro
0.0701 strtr_aix

# 'aa-bb-cc'*10
0.1474 strtr_aix
0.2261 strtr_thg
0.2366 strtr_gumbo
0.3226 strtr_kojiro

我自己的版本(稍微优化了Gumbo):

def strtr(strng,replace):
    buf,i = [],0
    while i < len(strng):
        for s,r in replace.items():
            if strng[i:len(s)+i] == s:
                buf.append(r)
                i += len(s)
                break
        else:
            buf.append(strng[i])
            i += 1
    return ''.join(buf)

完整的代码和时间:https://gist.github.com/2889181

这是一个天真的算法:

使用索引逐个字符地遍历原始字符串,并检查每个索引是否其中一个搜索字符串等于当前索引中的字符串.如果找到匹配项,请在缓冲区中按下替换项,然后按匹配字符串的长度继续索引.如果未找到匹配项,请按索引处理索引.最后,将缓冲区中的字符串连接到单个字符串.

def strtr(strng,replace):
    buffer = []
    i,n = 0,len(strng)
    while i < n:
        match = False
        for s,r in replace.items():
            if strng[i:len(s)+i] == s:
                buffer.append(r)
                i = i + len(s)
                match = True
                break
        if not match:
            buffer.append(strng[i])
            i = i + 1
    return ''.join(buffer)

php的strtr for python的更多相关文章

  1. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  2. ios – 如何在swift3中增加String.Index?

    在swift2.3中运算符用于string.index增加例如.一世我改为swift3代码发生了“一元运算符”不能应用于’@valueString.Index’类型的操作数(又名’@lvalueString.CharacterView.Index’)“在swift3中我改写了例如.i=1但是这段代码无法解决.请帮我.解决方法String.Index是String.CharacterView.Ind

  3. ios – CoreData有序关系 – 使用NSFetchRequest批量取消

    或者,是否存在批量不支持的API,它不是私有的?解决方法目前我有一个解决方案,但不是一个干净的解决方案:我希望按照有序关系中的20个小组进行批量修改.所以,每次我索引一个索引,它的索引除以20,我为接下来的20使用新的NSFetchRequest,并通过调用公共字段名称来解除它们.

  4. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  5. ios – Swift中的PageViewController当前页面索引

    我想获取一个pageViewController的当前索引,我不知道我如何获取可见页索引.解决方法您可以使用didFinishAnimating,并将标签设置为查看控制器.尝试这个

  6. ios – OpenGL – 为什么GL_ELEMENT_ARRAY_BUFFER的索引?

    我目前是OpenGLES2.0领域的新手,希望尽可能地了解绑定,缓冲区,着色器等.截至目前,我只是想了解GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY_BUFFER之间的差异,以及何时使用每个注释的预设.我目前的理解使我相信GL_ELEMENT_ARRAY_BUFFER是专门用于所述三角形的索引,而另一个则是其他的.有人可以详细说明为什么,如果这是正确的?GL_ELEMENT_A

  7. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  8. 如何恢复索引功能? (Xcode中)

    我的一个项目刚刚开始干扰索引过程.索引过程在中途冻结,然后突然停止,导致SourceKitService崩溃.我根本无法找到错误的代码;因为似乎没有!)–但它无法被索引.最初,我以为它是一个Xcode7.2的问题,所以升级到最新的beta(7.3);但是问题依然存在.我无法恢复到我的旧代码,因为太多的工作将被撤销,我无法发现特定的文件.崩溃报告是here.为了澄清,Xcode本身不会崩溃,只有索引过程.关于如何解决这个问题的任何想法?

  9. ios – Swift:通过索引移动数组中的元素

    给定n个元素的阵列,即vararray=[1,2,3,4,5]我可以写一个扩展到Array,所以我可以修改数组来实现这个输出:[2,5,1]:有没有办法实现这样的功能,可以通过任何索引(正或负)来移动数组.我可以用if-else子句强制执行这个功能,但是我正在寻找的是功能实现.算法很简单:>按提供的索引将数组拆分成两个>将第一个数组追加到第二个数组的末尾有没有什么办法实现它的功能风格?

  10. ios – 如何使用SwiftyJSON将字符串转换为JSON

    要转换的字符串:[{“description”:“Hi”,“id”:2,“img”:“hi.png”},{“description”:“pet”,“id”:10,“img”:“pet.png“},{”description“:”Hello!:D“,”id“:12,”img“:”hello.png“}]转换字符串的代码:varjson=JSON该字符串转换为JSON,当我尝试计算这个JSON里面有多少个块时,我得到0.打印控制台输出:0我失踪了什么帮助非常感激.解决方法实际上,在SwifyJSON中有一个内

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部