将字符串按数字列表拆分

3

我将尝试根据给定列表中的位置来拆分字符串,并将其添加到一个新的列表中。起始代码如下:

seq = 'ATCGATCGATCG'
seq_new = []
seq_cut = [2, 8 , 10]

我希望获得以下内容:

seq_new = ['AT', 'CGATCG', 'AT', 'CG'] 

位置列表的大小和值是可变的。我该如何处理这样的数据?

2个回答

7

使用zip创建用于切片的索引:

seq_new = [seq[start:end] for start, end in zip([None] + seq_cut, seq_cut + [None])]

这个函数将[None, 2, 8 , 10][2, 8, 10, None]压缩在一起,创建索引[(None, 2), (2, 8), (8, 10), (10, None)]None作为第一个索引默认为零,None作为第二个索引默认为被切片序列的大小。


1
糟糕 - 我只是要从我的编辑器中复制/粘贴几乎完全相同的内容 :p - Jon Clements
1
为了增加对称性,您可以在第一个上使用 None(就像我刚才做的那样!:P) - DSM
可以通过使用“成对比较”配方的修改版本(留给读者练习)来使其更加优雅,该配方在此帖子中有描述!得到的表达式将是[seq[start:end] for start, end in pairwise(seq_cut)] - mkrieger1
@mkrieger1:在itertools文档的配方部分可以找到pairwise的实现。我认为在这里不值得。代码大致相同:seq_new = [seq[start:end] for start, end in pairwise([None] + seq_cut + [None])] - Steven Rumbalski
是的,我也认为除非它将被使用多次,否则这并不值得。我想在pairwise的修改版本中,在前面和后面附加None,以便将这个小细节隐藏起来,不让用户看到。 - mkrieger1

4
使用切片(slicing):
seq = "ATCGATCGATCG"
seq_new = []
seq_cut = [2, 8, 10]

last = 0
for idx in seq_cut:
    seq_new.append(seq[last:idx])
    last = idx
seq_new.append(seq[last:])

Python的切片语法可能对不熟悉它的人来说有些令人生畏,但它非常强大。 (+1) https://docs.python.org/2.3/whatsnew/section-slices.html - user4205830

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接