2016-06-28 33 views
5

jestem usunięcie char z ciągiem tak:Python najlepszy sposób, aby usunąć z ciągiem char przez indeks

S = "abcd" 
Index=1 #index of string to remove 
ListS = list(S) 
ListS.pop(Index) 
S = "".join(ListS) 
print S 
#"acd" 

Jestem pewien, że jest to nie najlepszym sposobem, aby to zrobić.

EDYTOWANIE Nie wspomniałem, że muszę manipulować rozmiarem łańcucha o długości ~ 10^7. Dlatego ważne jest, aby dbać o wydajność.

Czy ktoś może mi pomóc. Jaki pytny sposób to zrobić?

+0

@soon proszę o uwagę. To nie jest duplikat. –

+1

Jest to duplikat, proszę spojrzeć na pierwszą odpowiedź połączonego pytania. – soon

+0

To bardzo duplikat. Wszystkie odpowiedzi są również dość powielone (w tym moje własne). –

Odpowiedz

15

można ominąć wszystkie operacje lista ze krojenia:

S = S[:1] + S[2:] 

lub bardziej ogólnie można znaleźć

S = S[:Index] + S[Index + 1:] 

Wiele odpowiedzi na swoje pytanie (w tym te, jak ten) tutaj: How to delete a character from a string using python? . Jednak to pytanie jest nominalnie o usuwaniu według wartości, a nie według indeksu.

+0

To najbardziej efektywny sposób? Wydaje się, że nie jest to pythonic. Działa jak chciałem. –

+1

Dlaczego zależy Ci na najbardziej wydajnym sposobie? Jaki jest rozmiar napisu i jak często usuwasz z niego znak? – soon

+2

@AlvaroJoao. Nie ma "skutecznego" sposobu usuwania elementów z łańcucha. Ciąg w języku Python jest niezmienny. Oznacza to, że będziesz musiał utworzyć tymczasowe kontenery i nowy końcowy ciąg niezależnie. Jeśli chcesz wydajnie, możesz zrobić coś takiego jak rozszerzenie 'list' i implementację niestandardowej metody' __str__'. –

3

Odcinanie jest najlepszy i najprostszy podejście mogę myśleć, oto niektóre inne alternatywy:

>>> s = 'abcd' 
>>> def remove(s, indx): 
     return ''.join(x for x in s if s.index(x) != indx) 

>>> remove(s, 1) 
'acd' 
>>> 
>>> 
>>> def remove(s, indx): 
     return ''.join(filter(lambda x: s.index(x) != 1, s)) 

>>> remove(s, 1) 
'acd' 

Pamiętaj, że indeksowanie jest od zera.

-1

Możesz zastąpić znak indeksu przez "".

str = "ab1cd1ef" 
Index = 3 
print(str.replace(str[Index],"",1)) 
+1

To nie zadziała zgodnie z oczekiwaniami dla "Index = 2", ponieważ usunie również wartość przy "5". –

+0

Jeśli dodać 1 w miejsce? Ogranicz zastępowanie do jednego wystąpienia. @MadPhysicist –

+0

Zmieniono moją odpowiedź, a teraz Index = 2 będzie pod opieką, Proszę upvote .. thanks – min2bro