繁体   English   中英

查找两个字符串之间的配对字母数

[英]Find the number of paired letter between two string

我有两个应该阅读的文件。 文件中的每一行都包含字符串。 我只是尝试在字符串中找到相同 position 处的配对字符数。 例如我的第一个文件是这样的:

ADEFGHAS
WESDHYKLMANYTRB
SAEDLKIANJJHHV
...

第二个文件:

ACDE
STRBGH
LKANBG
...

该程序应该像这样工作:

   ADEFGHAS     ADEFGHAS      ADEFGHAS    ADEFGHAS   ADEFGHAS
                               ||         |                          .....
ACDE          ACDE           ACDE         ACDE        ACDE
 hit=0           hit=0         hit=2      hit=1       hit=0

最大命中数/长度(string2)(这里 2/4=0.5)应该是这两个字符串的 output。 它应该对文件中的所有字符串进行此操作。 output 将是这样的:

     str1    str2      str3  ...  --(lines of second file)
str1  0.5      0.2     0.0    ...
str2  0.6      1.0     0.3    ...
...   ...     ...      ...     ...
 |
(lines of first file)

我在 python 中尝试了以下代码

def hitNumber(str1, str2):

   str1 = str1 
   str2= str2
 
   return sum(1 if i == j else 0 
           for i, j in zip(str1, str2)) / float(len(str2))


string1 = 'EAALEQ'
string2 = 'KYEI'

result = hitNumber(string1, string2)

print ("The hitNumber between 2 strings is : " + str(result))

但它从两个字符串的第一个点开始,不考虑其他步骤。 如何解决此问题并正确计算文件?

你可以试试这个 function,它捕获 str2 的所有 substring,对列表进行排序并找到最大值:

def maxHit(str1, str2):
    res = [str2[i: j] for i in range(len(str2))
       for j in range(i + 1, len(str2) + 1)]

    sorted_list = list(sorted(res, key = len, reverse=True))

    for sb in sorted_list:
        if sb in str1:
            return len(sb) / len(str2)

    return 0.0

print(maxHit("qsthsqdsdsdsdsdsdsd", "python"))  # here 2/6 = 0.3333

天真的解决方案

import pandas as pd  # only used for final formatting

def subs(s):
    " returns the list of sub strings of a string, ordered in reverse of their lengths "
    return [sub for sub_len in range(len(s),0,-1)
                for sub in [s[start: start + sub_len] for start in range(0, len(s)- sub_len + 1)]
           ]

def best_ratio_sub_in(slist, s):
    " returns the best ratio for substrings 'slist' in 's'  "
    lens = len(slist[0])
    for sub in slist:
        if sub in s:
            return len(sub)/lens
    return 0

def datavalues(strs1, strs2):
    " return a list of list of best_ratio of len of substrings of 'strs2' in a list of strings'str1' "
    bests = []
    for str2 in strs2:
        subslist = subs(str2)
        bests.append([best_ratio_sub_in(subslist, str1) for str1 in strs1])
    return [list(tup) for tup in zip(*bests)] # transpose 'bests'

data = datavalues(strs2, strs1)

df = pd.DataFrame(data = data, columns = strs2, index = strs1)
>>> df
                 ACDE    STRBGH    LKANBG
ADEFGHAS         0.50  0.333333  0.166667
WESDHYKLMANYTRB  0.25  0.500000  0.333333
SAEDLKIANJJHHV   0.25  0.166667  0.333333

我喜欢其他人的解决方案,但我也会发布我的解决方案,因为我的解决方案是最愚蠢的,有些人可能会觉得这很容易理解。

def hitNumber(str1, str2):
    maximum = 0
    len_str2 = len(str2)
    for x in range(1, len(str1) + len_str2):
        v = sum(1 if i == j else 0 
           for i, j in zip(str1[max(x - len_str2, 0):], str2[-x:]))
        if v == len_str2:
            return 1
        if v > maximum:
            maximum = v
    return maximum / len_str2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM