【问题标题】:How to Determine how similar two strings are (until a certain point) [closed]如何确定两个字符串的相似程度(直到某一点)[关闭]
【发布时间】:2020-08-10 22:15:05
【问题描述】:

我有一个字符串列表['49275', '49287', '69674', '43924']

我想看看它们与某个值有多相似(比如说'49375' 但是一旦存在差异,超出差异的所有内容都需要算作不相似(即使它们是相似的)

所以'49375''49275' 的相似度应该是 0.4 而不是 0.8

我尝试了下面的代码,但我被难住了,一定有更好的方法。

l = ['49275', '49287', '69674', '43924']
x = '49375'

listy = []
for i in l:
  for n in range(len(x)):
    if x[n] == i[0][n]:
      listy.append((n+1)/len(x))
    if x[n] != i[0][n]:
      break

我希望输出是一个相似性数字列表,即:[0.4, 0.4, 0, 0.2]

谢谢!

【问题讨论】:

  • 请提供预期的minimal, reproducible example。显示中间结果与您的预期不同的地方。 “我被难住了”不是问题规范:向我们展示您的输出,以及您的内部流程与您的预期有何不同。

标签: python string for-loop similarity


【解决方案1】:

你很亲密。您只想在字符不匹配的位置(即在break 之前)附加到listy,或者如果循环在没有break 的情况下完成,则附加1.0。

还请注意,您需要 i[n] 而不是 i[0][n] - i[0][n] 给了您一个 IndexError,因为您正在获取第一个字符,然后尝试从中获取字符 n

l = ['49275', '49287', '69674', '43924']
x = '49375'

listy = []
for i in l:
    for n in range(len(x)):
        if x[n] != i[n]:
            listy.append(n / len(x))
            break
    else:
        listy.append(1.)

print(listy)

【讨论】:

    【解决方案2】:

    试试这个:

    l = ['49275', '49287', '69674', '43924']
    x = '49375'
    
    listy = [0] * len(l)
    for i, el in enumerate(l):
        for n in range(len(x)):
            if el[n] != x[n]: break
            listy[i] += 0.2
    

    【讨论】:

      【解决方案3】:
      for n in range(len(x)):
          if x[n] == i[0][n]:
              listy.append((n+1)/len(x))
          if x[n] != i[0][n]:
              break
      

      以上是您的基本问题:您为列表中的 每个 匹配字符附加一个值,而不仅仅是最后一个。另请注意,您重复平等测试;这是不必要的。做两处改动:第一,简单的把多余的测试换成else

      for n in range(len(x)):
          if x[n] == i[0][n]:
              listy.append((n+1)/len(x))
          else:
              break
      

      其次,等到你退出这个循环到append这个值。这将解决额外数据的问题。

      实施留给学生练习。 :-)

      【讨论】:

        【解决方案4】:
        from itertools import takewhile
        
        
        def calc_similarity(l, x) -> list:
            similars = list()
            len_x = len(x)
        
            for item in l:
                a = list(takewhile(lambda ele: ele[1] == x[ele[0]], enumerate(item)))
                similars.append(len(a) / len_x)
        
            return similars
        
        if __name__ == '__main__':
            l = ['49275', '49287', '69674', '43924']
            x = '49375'
            similarities = calc_similarity(l, x)
            print(similarities)
        

        您可以使用 itertools 中的 takewhile

        从一个可迭代对象中返回连续的条目,只要谓词 每个条目的计算结果为 true。

        https://docs.python.org/3/library/itertools.html#itertools.takewhile

        同样枚举,第一个元素是索引,第二个元素是值

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          相关资源
          最近更新 更多