如果你有名单的话。。。
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,则在两个单独的列表中包括带有'>’的行以及它后面的序列(后面的序列始终在上
#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……如有任何帮助,我们将不胜感激
发布于 2013-03-12 06:05:09
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)))如果名称很多,那么在队列中查找名称可能比在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-12 05:38:57
使用列表理解
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-12 05:53:30
有更优雅的方法可以做到这一点,但我认为这个方法可能是您最容易理解的:
>>> 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.append(line))中。
如果是,那么您需要检查query中的任何名称是否出现在该行中。做这件事最简单的方法是什么?循环遍历每个名称(for name in query),并单独检查它(if name in line)
https://stackoverflow.com/questions/15349121
复制相似问题