0

名前のリストがある場合。。。

query = ['link','zelda','saria','ganon','volvagia']

およびファイルの行のリスト

data = ['>link is the first','OIGFHFH','AGIUUIIUFG','>peach is the second',
'AGFDA','AFGDSGGGH','>luigi is the third','SAGSGFFG','AFGDFGDFG',
'DSGSFGAAA','>ganon is the fourth','ADGGHHHHHH','>volvagia is the last',
 'AFGDAAFGDA','ADFGAFD','ADFDFFDDFG','AHUUERR','>ness is another','ADFGGGGH',
'HHHDFDA']

'>'で始まるすべての行をどのように確認し、name_listという名前のいずれかがある場合は、'>'の行とそれに続くシーケンスを含めることができます(後続のシーケンスは常に上部になります) 2つの別々のリストで

#example output file

name_list = ['>link is the first','>ganon is the fourth','>volvagia is the last']
seq_list = ['OIGFHFHAGIUUIIUFG','ADGGHHHHHH','AFGDAAFGDAADFGAFDADFDFFDDFGAHUUERR']

同様の状況で行うように促されたので、これを行うために辞書を使用したくない

だから私がこれまでに持っているのは:

for line,name in zip(data,query):
    if bool(line[0] == '>' and re.search(name,line))==True:
        #but then i'm stuck because len(query) and len(data) are not equal

....どんな助けでも大歓迎です」

4

3 に答える 3

1
result = []
names = ['link', 'zelda', 'saria', 'ganon', 'volvagia']
lines = iter(data)
for line in lines:
    while line.startswith(">") and any(name in line for name in names):
        name = line
        upper_seq = []
        for line in lines:
            if not line.isupper():
                break
            upper_seq.append(line)
        else:
            line = "" # guard against infinite loop at EOF 

        result.append((name, ''.join(upper_seq)))

名前が多い場合は、次set()の代わりに名前を並べて検索する方が速い場合がありany(...)ます。

names = set(names)
# ...
    if line.startswith(">") and names.intersection(line[1:].split()):
        # ...

結果

[('>link is the first', 'OIGFHFHAGIUUIIUFG'),
 ('>ganon is the fourth', 'ADGGHHHHHH'),
 ('>volvagia is the last', 'AFGDAAFGDAADFGAFDADFDFFDDFGAHUUERR')]
于 2013-03-11T22:05:09.107 に答える
0

リスト内包表記を使用する

print [line for line in lines if line.startswith(">") and set(my_words).intersection(line[1:].split())]

これは次のようにforループに分解されます

matched_line = []
for line in lines:
    if line.startswith(">") and set(my_words).intersection(line[1:].split()):
       matched_lines.append(line)

設定された共通部分を使用すると、リスト内の各単語をループして文字列内にあるかどうかを確認するよりも大幅に高速になります。

>>> print [line for line in data if line.startswith(">") and set(query).intersection(line[1:].split())]
['>link is the first', '>ganon is the fourth', '>volvagia is the last']
于 2013-03-11T21:38:56.720 に答える
0

これを行うにはもっと洗練された方法がありますが、この方法が最も理解しやすいと思います。

>>> found_lines = []
>>> sequences = []
>>> for line in data:
...     if line.startswith(">"):
...         for name in query:
...             if name in line:
...                 found_lines.append(line)
...     else:
...         sequences.append(line)
>>> print found_lines
['>link is the first', '>ganon is the fourth', '>volvagia is the last']
>>> 

常にシンプルに始めて、問題を自分のやり方で考えてください。あなたが最初にする必要があることは何ですか?data( )のすべての行をループしますfor line in data

これらの行ごとに、で始まるかどうかを確認し>ます。(if line.startswith(">"))。その文字で始まらない場合は、それが「シーケンス」であると見なして、sequencesリストに追加できます(sequences.append(line)

含まれている場合は、の名前のいずれかがqueryその行に表示されているかどうかを確認します。それを行う最も簡単な方法は何ですか?すべての名前をループし(for name in query)、それ自体をチェックします(if name in line

于 2013-03-11T21:53:30.357 に答える