python - 许多子序列之间的最长公共(public)序列

标签 python dictionary sequence

有趣的标题:) 我有一个包含以下内容的文件:

>sequence_40
ABCDABDCABCDBACDBACDBACDBACDABDCDC
ACDCCDCABDCADCADBCACBDCABD
>sequence_41
DCBACDBACDADCDCDCABCDCACBDCBDACBDC
BCDBABABBABACDCDBCACDBACDBACDBACDC
BCDB
...

然后,我有一个函数返回一个字典(称为 dict),该字典返回序列作为键,字符串(组合在一行)作为键的值。序列范围为 40 至 59。 我想获取序列字典并返回所有序列中找到的最长公共(public)子序列。设法在 stackoverflow 上找到一些帮助,并编写了一个代码,仅比较该字典中的最后两个字符串,而不是全部:)。 这是代码

def longest_common_sequence(s1, s2):
    m = [[0] * (1 + len(s2)) for i in range(1 + len(s1))]
    longest, x_longest = 0, 0
    for x in range(1, 1 + len(s1)):
        for y in range(1, 1 + len(s2)):
            if s1[x - 1] == s2[y - 1]:
                m[x][y] = m[x - 1][y - 1] + 1
                if m[x][y] > longest:
                    longest = m[x][y]
                    x_longest = x
            else:
                m[x][y] = 0
    return s1[x_longest - longest: x_longest]

for i in range(40,59):
    s1=str(dictionar['sequence_'+str(i)])
    s2=str(dictionar['sequence_'+str(i+1)])
longest_common_sequence(s1,s2)

如何修改它以获得字典中所有序列之间的公共(public)子序列?谢谢!

最佳答案

编辑:正如@lmcarreiro指出的,子字符串(或子数组子列表)和子序列之间存在相关差异。据我了解,我们在这里都在谈论子字符串,因此我将在回答中使用这个术语。

纪尧姆的回答可以改进:

def eachPossibleSubstring(string):
  for size in range(len(string) + 1, 0, -1):
    for start in range(len(string) - size + 1):
      yield string[start:start+size]

def findLongestCommonSubstring(strings):
  shortestString = min(strings, key=len)
  for substring in eachPossibleSubstring(shortestString):
    if all(substring in string
        for string in strings if string != shortestString):
      return substring

print findLongestCommonSubstring([
  'ABCDABDCABCDBACDBACDBACDBACDABDCDCACDCCDCABDCADCADBCACBDCABD',
  'DCBACDBACDADCDCDCABCDCACBDCBDACBDCBCDBABABBABACDCDBCACDBACDBACDBACDCBCDB',
])

打印:

ACDBACDBACDBACD

这更快,因为我返回第一个找到的内容并从最长到最短进行搜索。

基本思想是这样的:取出最短字符串中的每个可能的子字符串(按照从最长到最短的顺序),然​​后看看是否可以在所有其他字符串中找到该子字符串。如果是,则返回它,否则尝试下一个子字符串。

您需要了解生成器。尝试 e。 G。这个:

for substring in eachPossibleSubstring('abcd'):
  print substring

print list(eachPossibleSubstring('abcd'))

关于python - 许多子序列之间的最长公共(public)序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42575153/

相关文章:

Python VTK,如何录制视频?

python - 替换 Pandas 中跨列的重复值

Python:如何在特定索引位置获取数组的值?

python更新列表中的字典值

c# - 将 IDictionary 转换为字典

swift - 在 Swift 2.0 中使用 Stride

Elasticsearch:Span_near 和子串匹配

algorithm - 找出包含 1 和 0 一样多的最长子序列 O(n)

python - 识别 Python 中的换行符

arrays - Swift 巨大的数组字典,非常慢