Eén teken in een tekenreeks wijzigen

Wat is de gemakkelijkste manier in Python om een teken in een string te vervangen?

Bijvoorbeeld:

text = "abcdefg";
text[1] = "Z";
           ^

Antwoord 1, autoriteit 100%

Wijzig geen tekenreeksen.

Werk ermee als lijsten; verander ze alleen in strings als dat nodig is.

>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'

Python-strings zijn onveranderlijk (d.w.z. ze kunnen niet worden gewijzigd). Hier zijn veelredenen voor. Gebruik lijsten totdat je geen keus hebt, verander ze dan pas in strings.


Antwoord 2, autoriteit 38%

Snelste methode?

Er zijn drie manieren. Voor de snelheidszoekers raad ik ‘Methode 2’ aan

Methode 1

Gegeven door dit antwoord

text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)

Wat vrij traag is in vergelijking met ‘Methode 2’

timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027

Methode 2 (SNELLE METHODE)

Gegeven door dit antwoord

text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]

wat veel sneller is:

timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195

Methode 3:

byte array:

timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875

3, Autoriteit 21%

new = text[:1] + 'Z' + text[2:]

4, Autoriteit 7%

Python-snaren zijn onveranderlijk, u verandert ze door een kopie te maken.
De eenvoudigste manier om te doen wat je wilt is waarschijnlijk:

text = "Z" + text[1:]

De text[1:]Retourneert de tekenreeks in textvan positie 1 tot het einde, posities tellen van 0 zo ‘1’ is het tweede teken.

EDIT:
U kunt dezelfde snaarkniptechniek gebruiken voor een deel van de string

text = text[:1] + "Z" + text[2:]

of als de letter alleen verschijnt zodra u de zoek- en vervangingstechniek kunt gebruiken
onder


5, Autoriteit 2%

Beginnen met Python 2.6 en Python 3 U kunt bytearrays gebruiken die mutable zijn (kan worden gewijzigd in tegenstelling tot tekenreeksen):

s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg

Bewerken: gewijzigd Str naar S

EDIT2: Als tweetig alchemist vermeld in de opmerkingen, werkt deze code niet met Unicode.


6

Deze code is niet van mij. Ik kon me het siteformulier niet herinneren waar, ik nam het. Interessant is dat je dit kunt gebruiken om een of meer tekens te vervangen door een of meer tekens.
Hoewel dit antwoord erg laat is, kunnen beginners zoals ik (altijd) het nuttig vinden.

Tekstfunctie wijzigen.

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,

Antwoord 7

Zoals andere mensen al hebben gezegd, worden Python-strings over het algemeen verondersteld onveranderlijk te zijn.

Als u echter CPython gebruikt, de implementatie op python.org, is het mogelijk om ctypes te gebruiken om de stringstructuur in het geheugen te wijzigen.

Hier is een voorbeeld waarbij ik de techniek gebruik om een string te wissen.

Markeer gegevens als gevoelig in python

Ik vermeld dit voor de volledigheid, en dit zou je laatste redmiddel moeten zijn, want het is hackachtig.


Antwoord 8

Strings zijn onveranderlijk in Python, wat betekent dat je de bestaande string niet kunt wijzigen.
Maar als u een teken erin wilt wijzigen, kunt u er als volgt een nieuwe tekenreeks van maken,

def replace(s, position, character):
    return s[:position] + character + s[position+1:]

replace(‘Koning’, 1, ‘o’)
// resultaat: Kong

Opmerking: als u de positiewaarde groter geeft dan de lengte van de tekenreeks, wordt het teken aan het einde toegevoegd.

replace(‘Hond’, 10, ‘s’)
// resultaat: Honden


Antwoord 9

Eigenlijk kun je met strings zoiets als dit doen:

oldStr = 'Hello World!'    
newStr = ''
for i in oldStr:  
    if 'a' < i < 'z':    
        newStr += chr(ord(i)-32)     
    else:      
        newStr += i
print(newStr)
'HELLO WORLD!'

In principe ben ik “toevoegen” + “snaren” samen in een nieuwe reeks:).


10

Ik hou van f-strings:

text = f'{text[:1]}Z{text[2:]}'

in mijn machine Deze methode is 10% sneller dan de “snelle methode” van het gebruik van + tot aaneengesloten snaren:

>>> timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
1.1691178000000093
>>> timeit.timeit("text = 'abcdefg'; text = f'{text[:1]}Z{text[2:]}'", number =1000000)
0.9047831999999971
>>>

11

Ik wil graag een andere manier toevoegen om een ​​teken in een tekenreeks te veranderen.

>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'

Hoe sneller is het in vergelijking met het instellen van de tekenreeks in de lijst en het vervangen van de ITH-waarde en vervolgens weer lid te worden?

Lijstbenadering

>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295

mijn oplossing

>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526

Antwoord 12

Een oplossing die de methoden finden replacecombineert in een enkele regel if-statement zou kunnen zijn:

```python
my_var = "stackoverflaw"
my_new_var = my_var.replace('a', 'o', 1) if my_var.find('s') != -1 else my_var
print(f"my_var = {my_var}")           # my_var = stackoverflaw
print(f"my_new_var = {my_new_var}")   # my_new_var = stackoverflow
```

Antwoord 13

probeer dit:

old_string = "mba"
string_list = list(old_string)
string_list[2] = "e"
//Replace 3rd element
new_string = "".join(string_list)
print(new_string)

Other episodes