2017-04-06 81 views
1

我有一个字符串,我有我需要删除的子串的位置的列表:如何通过在Python中的位置来删除多个子字符串?

text = 'ab cd ef gh' 
positions = [[2, 5], [8, 11]] 

列表中的每一个元素都包含开始和字符串的结束位置。结束位置是排他性的,起始位置包含在内。因此,应当将字符串转换为:与位置列表

text = 'ab ef' 

长度是未知的,所以soultion不能只是硬编码。

是否有任何有效的方法来删除多个子字符串的位置?职位不能重叠。

+0

这些值是什么?[2,5]? – AKS

+0

@AKS indeces [开始,结束]。通过期望的输出来判断它是[包含性的,排他性的]。 – alex

+0

'end'索引包含还是独占?你已经提出了一个非常不明确的问题,也没有表明你已经试图达到预期产出。 – AKS

回答

4

字符串是不可改变,所以就地缺失是一个不走。并且连续级联并不理想。

您可以转换的字符串列表,以使它可以突变和简单地通过删除每个不必要的切片擦拭所需的位置。使用str.join重新创建的字符串:

text = 'ab cd ef gh' 

lst = list(text) 
for i in positions[::-1]: # iterate from behind so index does not shrink inwards 
    del lst[slice(*i)] 

text = ''.join(lst) 
print(text) 
# 'ab ef' 

请注意,转换要列出恒定类型的突变也通过文档的最佳实践建议:

串联不变序列总是导致一个新的对象。这个 意味着通过重复级联来建立序列将在总序列长度中具有 a 平方运行时间成本。为了得到线性运行成本,你必须切换到下面的选项之一:

  1. 如果串联str对象,你可以建立一个列表,并使用 str.join()在年底或者写一个io.StringIO实例, 完成后检索其值
1

这应该很容易。

" ".join(text.split()[0::2]) 

纵切将有助于在这里跳过一些地方,如

[start:end:difference] 
2

您对未来的指标,以抵消它的工作原理。所以我们首先通过text[:2] + text[5:]得到字符串的其余部分(不包括两个索引),然后我们也需要抵消它,因为我们从字符串中删除项目。所以,我们会将偏移量添加到每个位置项目。

text = 'ab cd ef gh' 
positions = [[2,5],[8,11]] 
offsetNextIndexes = 0 
for position in positions: 
    text = text[:position[0] + offsetNextIndexes] + text[position[1] + offsetNextIndexes:] 
    offsetNextIndexes += position[0] - position[1] 
print(text) 
相关问题