【问题标题】:Returning sequences with two mismatches from original string从原始字符串返回具有两个不匹配的序列
【发布时间】:2018-02-11 05:12:18
【问题描述】:

我正在寻找一些代码来返回原始字符串中具有两个不匹配的所有序列,以便找到与我输入的原始序列相似的蛋白质序列部分。例如,在 LELFLKEF 中搜索 LKLD 应返回: LELF LKEF LFLK 我已经查看了各种 python 方法来做到这一点,但我似乎无法做任何工作。

Search for string allowing for one mismatch in any location of the string

String regex two mismatches Python

Ambiguous substring with mismatches

【问题讨论】:

  • 顺序重要吗? DLLKFA 中的 LKLD 是否会返回 LKFA 和 DLLK(所有字母按差异顺序排列)。
  • 是的,字母的顺序很重要。 DLLK 不起作用。

标签: python string function search


【解决方案1】:

一个简单的方法是遍历序列并为查询“LKLD”与主题序列“LELFLKEF”的每个对齐计算hamming distance。在链接的维基百科文章中有一个汉明距离计算的示例实现。一旦你有了,你的代码就会做这样的事情:

# hamming distance
d = lambda s1, s2: sum(e1 != e2 for e1, e2 in zip(s1, s2))

subject = 'LELFLKEF'
query = 'LKLD'
for i in range(len(subject)-len(query)+1):
    aligned_subject = subject[i:i+len(query)]
    if d(aligned_subject, query) == 2:
         print(aligned_subject)

输出:

LELF
LFLK
LKEF

请注意,这是一个有点幼稚的解决方案,有足够的优化空间,但它适用于简单的情况和相当小的字符串。生成列表的精简版本:

s='LELFLKEF'
q='LKLD'
d= lambda s1, s2: sum(e1 != e2 for e1, e2 in zip(s1, s2))
[s[i:i+len(q)] for i in range(len(s)-len(q)+1) if d(s[i:i+len(q)],q) == 2]

for 循环遍历两个字符串的所有可能的未间隙对齐方式:

0
LELFLKEF
||||
LKLD
 1
LELFLKEF
 ||||
 LKLD
  2
LELFLKEF
  ||||
  LKLD
   3
LELFLKEF
   ||||
   LKLD
    4
LELFLKEF
    ||||
    LKLD

alignment of biological sequences 的问题也有很多实现,因此您可能还想探索一些更复杂的技术来处理诸如间隙对齐和more complicated modeling of substitutions 之类的事情

【讨论】:

  • 您的代码似乎忽略了字母的顺序:它给出的结果类似于 ELFL,这确实与原始序列有两个字母不同,但如果您查看它们的位置,则有四个字母不同。
  • 我打印出所有比较来说明,它很容易按距离 == 2 过滤,但我会编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多