2010-01-29 12 views
8

W python, czy ciągi są zmienne? Linia someString[3] = "a" wyrzuca błądZastępowanie jednego znaku ciągu w pythonie

TypeError: 'str' object does not support item assignment

widzę dlaczego (jak mogłem napisany someString [3] = „test” i że byłoby oczywiście niezgodne z prawem), ale czy istnieje sposób, aby zrobić to w Pythonie?

+0

Mam ciąg znaków binarnych i pod pewnymi warunkami, chcę odwrócić konkretne 0 do 1. – Chris

+0

Ale ogólnie, chciałbym odwrócić konkretną literę x na y. Teraz mam do czynienia z ciągami binarnymi, ale jest to ogólne zapytanie. – Chris

+0

Kolejna porada: Jeśli robisz "ciągi binarne", tj. Ciągi składające się tylko z 1 i 0, sprawdź bibliotekę podobną do BitVector, która jest szybsza i wygodniejsza do manipulacji wektorami bitowymi. Zobacz także na bitach wektory w Python na http://stackoverflow.com/questions/2147848/how-do-i-represent-and-work-with-n-bit-vectors-in-python/2147873 # 2147873 –

Odpowiedz

13

Łańcuchy w języku Python są niezmienne, więc nie obsługują elementu ani przypisania plasterka. Będziesz musiał zbudować nowy ciąg znaków, np. someString[:3] + 'a' + someString[4:] lub inne odpowiednie podejście.

8

Zamiast przechowywać swoją wartość jako ciąg znaków, można użyć listę znaków:

>>> l = list('foobar') 
>>> l[3] = 'f' 
>>> l[5] = 'n' 

Następnie, jeśli chcesz, aby przekształcić go z powrotem do łańcucha, aby go wyświetlić, użyj:

>>> ''.join(l) 
'foofan' 

Jeśli zmieniasz wiele znaków pojedynczo, ta metoda będzie znacznie szybsza niż tworzenie nowego ciągu przy każdej zmianie postaci.

+1

Też bardzo podoba mi się ta odpowiedź. Dzięki za tonę. Muszę przyzwyczaić się do programowania w stylu Pythona :) – Chris

+0

@Chris: Gorąco polecam tę książkę: http://www.amazon.ca/Programming-Python-Complete-Introduction-Language/dp/0137129297/ref=sr_1_6? ie = UTF8 & s = books & qid = 1264800285 & sr = 8-6 – MikeyB

2

W całkiem nowych pytonach można również użyć wbudowanego typu bytearray, który można zmienić. Zobacz dokumentację stdlib. Ale "wystarczająco dużo" oznacza tutaj 2.6 lub więcej, więc niekoniecznie jest to opcja.

W starszych pytonach należy utworzyć świeżą str, jak wspomniano powyżej, ponieważ są one niezmienne. Zazwyczaj jest to najbardziej czytelne podejście, ale czasami użycie innego rodzaju modyfikowalnej sekwencji (takiej jak lista znaków lub prawdopodobnie array.array) ma sens. array.array jest nieco niezgrabny i zwykle unikany.

1
>>> import ctypes 
>>> s = "1234567890" 
>>> mutable = ctypes.create_string_buffer(s) 
>>> mutable[3] = "a" 
>>> print mutable.value 
123a567890 
Powiązane problemy