python索引字符串_Python:通过索引删除子字符串

我有以下相当简单的片段:

def delete_substring_blocks(s, blocks):

'''

s: original input string

blocks: list of indices (start, end) to be deleted

return string `out` where blocks are deleted from s

'''

out = ''

p = 0

for start, end in blocks:

out += s[p:start]

p = end

out += s[p:]

return out

此函数接受一个字符串s并从s中删除所有s [start:end],其中索引(start,end)对在列表块中给出.

是否有某个内置函数可以执行相同的操作?

更新:

我的代码中有一个假设:

>块按第一个索引按升序排序(由list.sort()就地完成)

至于块是否可以重叠,在我的用例中我确保它们在调用函数之前没有.但为了好玩,我们也可以假设他们这样做.

解决方法:

我的方法将块转换为一组索引,我称之为排除.之后,循环遍历字符串并排除索引在排除集中的那些字符.我使用set而不是list,因为它很好地处理重复项(如果重叠范围).

构建排除集

给定一个无序的,可能重叠的范围列表:

blocks = [(5, 7), (2, 4), (6, 10)]

我想将其转换为:

exclude = {2, 3, 5, 6, 7, 8, 9}

怎么样:

exclude = set()

for block in blocks:

exclude.update(range(*block))

把它们放在一起

这是我的代码和最后的一个小例子.请注意,我选择重命名该函数,因为此函数足够通用,可以处理字符串,列表,元组和其他可迭代对象,而不仅仅是字符串.另外,因为函数返回一个列表,所以在处理字符串时,我们需要将字符列表重新加入.

def delete_blocks(iterable, blocks):

exclude = set()

for block in blocks:

exclude.update(range(*block))

return [cell for i, cell in enumerate(iterable) if i not in exclude]

# Try it out

test_string = '0123456789abc'

blocks = [(5, 7), (2, 4), (6, 10)]

result = ''.join(delete_blocks(test_string, blocks))

print('Before: {!r}'.format(test_string))

print('Blocks:', blocks)

print('After: {!r}'.format(result))

更新:实现delete_substring_blocks

为了真正回答Mai的问题,我使用delete_blocks实现了delete_substring_blocks:

def delete_substring_blocks(s, blocks):

return ''.join(delete_blocks(s, blocks))

标签:python,string

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值