从lis中的元素增加字符串时循环失败

2024-09-30 12:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

序列发生器有点问题。我有一个文件,每行包含一个片段(8个字母)。我将它从文件加载到列表中,其中每个元素都是一个片段。它是DNA,所以应该这样:

1取第一个8个字母的元素
2检查前7个字母与前7个字母相同的元素。
三。在序列中添加第二个元素的第8个字母。

应该是这样的:

ATTGCCAT
 TTGCCATA
  TGCAATAC

So序列:ATTGCATAC

不幸的是,它只添加了一个元素。:(给出了第一个元素(我们知道)。我是这样做的,它是文件中的第一行(第一行)。在

代码如下:

^{pr2}$

我删除了检查和频谱函数,因为它是简单的计算,例如长度比较,所以它并不像我想的那样引起问题。在

我将非常感谢你的帮助!在

谨致问候, 马特乌斯


Tags: 文件代码元素列表so字母序列dna
3条回答

为了好玩和有趣,我用OO重写了这个问题。看看你的想法:

import collections
import sys
import random

usage = """
Usage:
    sequence fname expected

Where
    fname:     name of file containing fragments
    expected:  result-string which should be obtained by chaining from first fragment.
"""

class Frag(str):
    MATCHLEN = 7

    def __new__(cls, s=''):
        return str.__new__(cls, s.strip())

    def head(self):
        return Frag(self[:Frag.MATCHLEN])

    def tail(self):
        return Frag(self[Frag.MATCHLEN:])

    def nexthead(self):
        return Frag(self[-Frag.MATCHLEN:])

    def check(self, s):
        return self.__eq__(s)

    def __add__(self, s):
        return Frag(str(self).__add__(s))

class Fraglist(list):
    @classmethod
    def fromFile(cls, fname):
        with open(fname, "r") as inf:
            lst = [Frag(ln) for ln in inf]
        return cls(lst)

    def shuffle(self):
        random.shuffle(self)

class Sequencer(object):
    def __init__(self, seq=None):
        super(Sequencer, self).__init__()
        self.sequences = collections.defaultdict(list)
        if seq is not None:
            for frag in seq:
                self.sequences[frag.head()].append(frag.tail())

    def build(self, frag):
        res = [frag]
        match = frag.nexthead()

        while match in self.sequences:
            next = random.choice(self.sequences[match])
            res.append(next)
            match = (match + next).nexthead()

        return Frag(''.join(res))

def main():
    if len(sys.argv) != 3:
        print usage
        sys.exit(-1)
    else:
        fname = sys.argv[1]
        expected = sys.argv[2]

        frags = Fraglist.fromFile(fname)
        frag1 = frags.pop(0)
        frags.shuffle()

        seq = Sequencer(frags)
        result = seq.build(frag1)

        if result.check(expected):
            print "Match!"
        else:
            print "No match"

if __name__=="__main__":
    main()

因为你的片段是被洗牌的,你的算法需要考虑到这一点;目前,你只是在片段中循环一次,如果它们的顺序不正确,就不太可能包含多个片段。例如,假设你有5个片段,我将根据它们在序列中的顺序来引用它们。现在碎片有点乱了:

1-3-2-4-5

你的算法将从1开始,跳过3,然后在2上匹配,最后加一个基数。然后检查4和5,然后完成,永远不会到达碎片3。在

你可以很容易地解决这个问题,每次你添加一个基时都重新开始循环,但是,对于大量的基,这将很难扩展。相反,我建议将您的片段加载到trie,然后在每次添加碱基时在trie中搜索下一个片段,直到为每个片段添加了一个碱基,或者您再也找不到匹配的片段。在

为我工作:

>>> seq = "ATTGCCAT"
>>> frags = ["TTGCCATA", "TGCCATAC"]
>>> for f in frags:
...         if seq[-7:] == f[:7]:
...             seq += f[-1:]
... 
>>> seq
'ATTGCCATAC'

你的例子中有个拼写错误,TGCAATAC应该是TGCCATAC。但是修复它的工作。在

相关问题 更多 >

    热门问题