我有以下相当简单的代码段:
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[start:end]
从中删除全部s
,在(start, end)
列表中给出索引对blocks
。
是否有内置函数可以执行相同的操作?
更新:我的代码中有一个假设:
list.sort()
就地完成)至于块是否可以重叠,在我的用例中,我确保在调用函数之前它们不会重叠。但是为了好玩,我们也可以假设他们这样做。
我的方法转变blocks
为一组称为索引的索引exclude
。之后,遍历字符串并排除索引位于exclude
集合中的那些字符。我使用set而不是list,因为它很好地处理了重复项(在重叠范围的情况下)。
exclude
集合给定一个无序的,可能重叠的范围列表:
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_substring_blocks
使用了delete_blocks
:
def delete_substring_blocks(s, blocks):
return ''.join(delete_blocks(s, blocks))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句