Python中不使用[:]切片高效分割字符串为指定子串的方法
无需使用[:]切片分割序列的方法
你需要的是将序列拆分为所有非空前缀+非空后缀的组合,对应示例中的效果:
G ATAAG GA TAAG GAT AAG GATA AG GATAA G
以下是几种无需使用[:]切片语法的高效实现:
方案1:使用itertools.islice
利用islice生成迭代器来构建左右部分,可读性和效率都不错:
import itertools def split_sequence(seq): seq_len = len(seq) for split_pos in range(1, seq_len): left = ''.join(itertools.islice(seq, split_pos)) right = ''.join(itertools.islice(seq, split_pos, None)) yield left, right # 测试 s = "GATAAG" for left, right in split_sequence(s): print(f"{left:6} {right}")
输出:
G ATAAG GA TAAG GAT AAG GATA AG GATAA G
方案2:用双端队列优化逐步拆分
对于较长序列,使用deque的O(1)操作来提升效率,避免重复遍历:
from collections import deque def split_sequence(seq): left = deque() right = deque(seq) if not right: return # 每次将right的首元素移到left,生成拆分对 while len(right) > 1: left.append(right.popleft()) yield ''.join(left), ''.join(right) # 测试 s = "GATAAG" for left, right in split_sequence(s): print(f"{left:6} {right}")
方案3:手动迭代构建(无依赖)
如果不想引入任何库,可以手动通过迭代器逐步构建左右部分:
def split_sequence(seq): left_chars = [] seq_iter = iter(seq) try: # 初始化left为第一个字符 left_chars.append(next(seq_iter)) except StopIteration: return # 空序列直接返回 right_chars = list(seq_iter) # 生成第一组拆分 yield ''.join(left_chars), ''.join(right_chars) # 逐个移动right的字符到left while right_chars: left_chars.append(right_chars.pop(0)) yield ''.join(left_chars), ''.join(right_chars)
对比你之前的方案
- 你找到的
subslices方法返回的是所有连续子切片,而非拆分后的前后对,不符合需求; - 你自己的
splitting_kmer方法使用了[:]切片,且输出顺序与示例相反,调整为split_pos从1到len(s)-1,取s[:split_pos]和s[split_pos:]也能实现,但不符合你“无需切片”的要求。
内容的提问来源于stack exchange,提问作者Paulo Sergio Schlogl
相关产品推荐
相关产品推荐

