【问题标题】:Split a string with list of numbers用数字列表拆分字符串
【发布时间】:2015-05-16 06:50:19
【问题描述】:

我正在尝试按列表中给出的位置拆分字符串,并将这些部分添加到新列表中。我开始:

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

我想得到:

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

位置列表的大小和值是可变的。我怎样才能这样处理我的数据?

【问题讨论】:

    标签: python list split


    【解决方案1】:

    使用zipslicing创建索引:

    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 作为第二个索引默认为被切片序列的大小。

    【讨论】:

    • 该死-只是从我的编辑器中复制/粘贴几乎完全相同:p
    • 为了增加对称性,您可以在第一个上使用None(就像我刚刚做的那样!:P)
    • 这可以通过使用this post 中描述的“成对”配方的修改版本(留给读者作为练习)变得更加优雅!结果表达式为[seq[start:end] for start, end in pairwise(seq_cut)]
    • @mkrieger1:pairwise 的实现可以在itertools 文档的配方部分找到。我觉得这里不值得。代码大致相同:seq_new = [seq[start:end] for start, end in pairwise([None] + seq_cut + [None])]
    • 是的,我也认为它不值得,除非它会被多次使用。我的意思是在 pairwise 的修改版本的前后附加 None,以向用户隐藏这个小细节。
    【解决方案2】:

    使用切片:

    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:])
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2011-11-13
    相关资源
    最近更新 更多