【问题标题】:Python - Most efficient way to compare # of words sequenced in "right" order across two strings/listsPython - 比较两个字符串/列表中以“正确”顺序排列的单词数的最有效方法
【发布时间】:2010-10-24 16:50:32
【问题描述】:

我想知道解决这个问题的计算效率最高的 Python 方法是什么。

假设您有两个字符串(或拆分这些字符串的列表——没关系),“这是正确的字符串”与“这是正确的字符串”。

我们假设第一个字符串总是正确的,并且将根据以正确顺序排列的单词为第二个字符串分配分数。对于上述两个字符串,我们将分配 0.6 分(因为 5 个单词中只有 3 个在正确的位置)。

最好, 乔治娜

【问题讨论】:

    标签: python string list comparison sequence


    【解决方案1】:

    这听起来很像家庭作业。试着想一想。是否遍历正确单词列表一次,并检查第二个列表中的对应单词是否与正确列表中的单词相等?

    我可能会在 python 中压缩列表并比较它们是否相等。

    【讨论】:

    • 想出 a 解决方案很容易,但我正在寻找最快、计算效率最高的解决方案!
    【解决方案2】:
    a = "this is the right string"
    b = "this is right the string"
    
    sum([1 for i,v in zip(a.split(), b.split()) if i == v])
    

    【讨论】:

    • 那里不需要列表理解
    • @SilentGhost:是的,谢谢,我应该开始更多的生成器表达式:)
    • @eumiro:我认为改变是微不足道的,不是吗?除了帮助某人解决问题并不意味着给他所有的答案,只是给出一些正确答案的提示也可以帮助他
    • 确实如此。如果 OP 正在搜索“计算高效”的代码,他可以检查 itertools。但是如何懒惰地拆分()一个字符串?
    【解决方案3】:
    sum(f == s for f, s in zip(first, second)) / len(first)
    

    【讨论】:

    • 在 Python 2.x 中返回 0 因为整数除法。可能需要一些float()
    • @eumiro: 可能会根据输入返回 1
    • 是的,可能返回 1。但在 OP 的示例中应该返回 0.6 并返回 0。
    • @eumiro:这完全不是重点。接受者的答案也不返回 0.6。
    【解决方案4】:

    使用ord() 将每个字符转换为整数值(其序数值),然后使用按位运算符^ 对每个字符进行异或。如果字符相同,则异或运算将返回0(零),然后使用|= 将返回的值与result 进行按位或运算,然后将运算结果保存为result。如果在遍历所有字符后result 仍然为零,则字符串是等效的。

    a = "this is the right string"
    b = "this is right the string"
    
    result = 0
    for x,y in zip(a,b):
        result |= ord(x) ^ ord(b)
    
    (if result == 0): print "Equivalent"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多