1

したがって、ファイルから読み取った文字列のリストがあります(クエリ)。">" で始まるすべての行を name_list というリストに追加し、それに続くすべてのアルファベット文字 (ただし、次の ">" 行の前) をリストに追加したいと考えています。これは、集合論に関して以前私がしなければならなかった非常によく似た質問ですが、while ループを操作しようとすると、無限のフィードバックループに巻き込まれました...

これは文字列のリストの例です

query = [">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none", 'caatgcctttgcctcactgataatttctattagtcttatcttatttcatt', 'ttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACT', 'GGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA',">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none", 'ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATT', 'TTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGA', 'TCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']

これは私が取り組んできたコードです:

name_list = []
seq_list = []

for line in query:

    while line.startswith(">"):
        name=line
        temp_seq=[]

        for line in query:
            if line.isalpha()==True:
                temp_seq.append(line)


            else:
                break
        name_list.append(name)
        seq_list.append(''.join(temp_seq))

出力データの例:

name_list = [">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none",">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none"]

seq_list = ['caatgcctttgcctcactgataatttctattagtcttatcttatttcattttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACTGGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA','ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATTTTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGATCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']

申し訳ありませんが、これが ( Search for word (from list of words) in line (from list of lines) and append values to new list. Python ) に似ていて、冗長である場合は申し訳ありませんが、人々を助けるのに良い質問だと思いましたこのタイプのデータを扱う人。

4

3 に答える 3

0

クエリの要素を一度に1つずつループするコードの変更は次のとおりです。

name_list = []
seq_list = []

seq = ""
for line in query:
    if line.startswith('>'):
        if seq:
            seq_list.append(seq)
            seq = ""
        name_list.append(line)
    elif line.isalpha():
        seq = seq + line
seq_list.append(seq)

しかし、あなたが提供した例では、query「名前」の一貫したパターンがあり、その後に3つの「シーケンス」が続きます。データが常にこの一貫したパターンに従っている場合は、別の方法があります。grouperitertools docsから取得した)という関数を定義できます。これにより、一度に4つの要素を読み取ることができますquery

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

ここで、の4つの要素「チャンク」ごとにquery、最初の要素を「名前」に追加し、最後の3つを連結して「シーケンス」に追加します。

names = []
sequences = []

for chunk in grouper(4, query):
    names.append(chunk[0])
    sequences.append(''.join(chunk[1:]))

print names
print sequences

出力:

[">mm10_refGene_NM_001011532 range=chr2:86084810-86085854 5'pad=0 3'pad=0 strand=- repeatMasking=none", ">mm10_refGene_NM_001011534 range=chr2:85352995-85353924 5'pad=0 3'pad=0 strand=- repeatMasking=none"]
['caatgcctttgcctcactgataatttctattagtcttatcttatttcattttactttgcagctgttaagacttgatgaaATGGCTGGAAGCAATGCCACTGGTGTGACAGAATTCATTCTCTTGGGGTTTGCAGTCCAGAGAGAGGTAGA', 'ATGGAACAAAGTAATGACACCAAAGTGACTGAATTCATTCTTCTGGGATTTTCCGGACAGCACAAATCTTGGCACATTCTGTTCATAATATTTCTAATGATCTATGTTGTCACACTCATGGGTAACATTGGAATGATCGTACTCATCAAA']
于 2013-03-21T23:18:54.640 に答える
0
name_list = []
seq_list = []

lines = iter(query)
for line in lines:
    while line.startswith(">"):
        name = line
        temp_seq = []
        for line in lines:
            if line.isalpha():
                temp_seq.append(line)
            else:
                break
        name_list.append(name)
        seq_list.append(''.join(temp_seq))
于 2013-03-21T22:32:11.317 に答える
0

あなたはこれを非常に簡単に行うことができますitertools.groupby

from itertools import groupby

def name_seq_chunks(seq): 
    isheader = lambda l:l.startswith('>')
    header = None
    for startgroup, dataiter in groupby(seq, isheader):
        if startgroup is True:
            header = list(dataiter)[-1]
        elif startgroup is False:
            yield header, ''.join(dataiter)

print list(name_seq_chunks(query))

これにより、 のようなタプルのリストが生成され[('>header', 'caatgccttt...'), ...]ます。本当に別々にしたい場合は、リストを再圧縮できます。

names, seqs = zip(*name_seq_chunks(query))
于 2013-03-21T23:33:32.910 に答える