2017-04-06 76 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) 
相關問題