所以我有一个从文件(查询)读取的字符串列表。我想追加所有以“>”开头的行到一个名为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)类似,并且在任何方面都是多余的,但我认为帮助处理此类数据的人是一个很好的问题。
答案 0 :(得分: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))
答案 1 :(得分:0)
以下是对代码的修改,它一次循环查询一个元素:
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个“序列”。如果您的数据始终遵循这种一致的模式,那么这是另一种方法。您可以定义一个名为grouper
(taken from the itertools docs)的函数,它可以让您一次读取query
的4个元素。
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)
现在,对于query
的每个4元素“块”,将第一个元素追加到“names”,并将最后一个元素连接到“序列”:
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']
答案 2 :(得分: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))