我正在研究分析蛋白质氨基酸含量的程序(特别是含有非常丰富的G / L含量的区域)。
我使用以下方法将不同长度的序列分成20aa的“块”
seq = 'MVFRSPLDLYSSHFLLPNFADSHHCSLLLASSGGGSGASGGGGGAGGGGGGNRAGGGGAGGAGGGSGGGGSRAPPEELSMFQLPTLNFSPEQVASVCETLEETGDIERLGRFLWSLPVAPGACEAINKHESILRARAVVAFHTGNFRDLYHILENHKFTKESHGKLQAMWLEAHYQEAEKLRGRPLGPVDKYRVRKKFPLPRTIWDGEQKTHCFKERTRSLLREWYLQDPYPNPSKKRELAQATGLTPTQVGNWFKNRRQRDRAAAAKNRLQHQAIGPSGMRSLAEPGCPTHGSAESPSTAASPTTSVSSLTERADTGTSILSVTSSDSECDV'
w = 20 #chunk size
interval = 20
for i in range(0,len(seq)-w,interval):
chunk = seq[i:i+w]
chunk2 = list(chunk)
然而,如果它不是20的倍数,则会减少序列的结尾,例如len(seq)= 333
这给了我1-320作为块,但321-333被忽略。如何将这些“剩菜”放入清单?
答案 0 :(得分:5)
如果您从-w
电话中取出range
,则可以使现有代码生效。切断序列的末尾是完全合法的,它只返回比你要求的更短的结果。
如果你想要一个虚拟值来填充序列的最后一部分的缺失部分(而不是丢失的最后部分),你可以使用来自{{3}的grouper
食谱}:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)