[英]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.