Python - 防止“for i in range:”切断序列结束

时间:2014-02-11 12:35:08

标签: python python-2.7

我正在研究分析蛋白质氨基酸含量的程序(特别是含有非常丰富的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被忽略。如何将这些“剩菜”放入清单?

1 个答案:

答案 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)