2016-06-28 7 views
5

Ich Entfernen eines char aus Zeichenfolge wie folgt zu entfernen:Python beste Weg, Zeichen aus der Zeichenfolge durch den Index

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

Ich bin sicher, dass diese nicht der beste Weg, es zu tun ist.

EDIT Ich habe nicht erwähnt, dass ich eine Zeichenfolge Größe mit Länge ~ 10^7 manipulieren muss. Es ist also wichtig, auf Effizienz zu achten.

Kann mir jemand helfen. Welchen pythonischen Weg, es zu tun?

+0

@soon bitte beachten Sie die Frage. Es ist kein Duplikat. –

+1

Es ist doppelt, bitte werfen Sie einen Blick auf die erste Antwort der verknüpften Frage. – soon

+0

Es ist sehr doppelt. Alle Antworten sind auch ziemlich doppelt (einschließlich meiner eigenen). –

Antwort

15

können Sie umgehen, alle Listenoperationen mit Slicing:

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

oder allgemeiner

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

Viele Antworten auf Ihre Frage (einschließlich solcher, wie diese) sind hier zu finden: How to delete a character from a string using python? . Diese Frage betrifft jedoch nominell das Löschen nach Wert, nicht nach Index.

+0

Das ist der effizienteste Weg? Scheint so nicht pythonisch. Es funktioniert so, wie ich es wollte. –

+1

Warum interessieren Sie sich für den effizientesten Weg? Wie groß ist die Zeichenkette und wie oft entfernen Sie einen Charakter daraus? – soon

+2

@AlvaroJoao. Es gibt keine "effiziente" Möglichkeit, Elemente aus einer Zeichenfolge zu entfernen. Eine Zeichenfolge in Python ist unveränderlich. Das bedeutet, dass Sie unabhängig davon temporäre Container und eine neue finale Zeichenfolge erstellen müssen. Wenn Sie effizient arbeiten möchten, können Sie etwas wie "liste" erweitern und eine benutzerdefinierte "__str__" -Methode implementieren. –

3

Slicing die beste und einfachste Ansatz ist, ich denken kann, sind hier einige andere Alternativen:

>>> 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' 

Denken Sie daran, dass die Indizierung ist nullbasiert.

-1

Sie können das Indexzeichen durch "" ersetzen.

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

Dies funktioniert nicht wie erwartet für 'Index = 2', da auch der Wert '5' entfernt wird. –

+0

Wenn 1 ersetzen ersetzen? Begrenzen Sie das Ersetzen auf ein Vorkommen. @MadPhysicist –

+0

Geändert meine Antwort und jetzt Index = 2 wird aufgepasst, bitte upvote..dank – min2bro