gpt4 book ai didi

python - 通过给定的索引对列表删除子字符串

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:51 25 4
gpt4 key购买 nike

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

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) 在列表 blocks 中给出。

是否有某个内置函数可以做同样的事情?


我的代码中有一个假设:

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

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

最佳答案

我的方法将 blocks 转换为一组索引,我称之为 exclude。之后,遍历字符串并排除那些索引在 exclude 集合中的字符。我使用 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 - 通过给定的索引对列表删除子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com