답변:
문자열을 수정하지 마십시오.
그것들을 목록으로 사용하십시오. 필요할 때만 문자열로 바꾸십시오.
>>> 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'
파이썬 문자열은 변경할 수 없습니다 (즉, 수정할 수 없습니다). 여기에는 많은 이유가 있습니다. 선택의 여지가 없을 때까지 목록을 사용하고 나서 만 문자열로 바꾸십시오.
MID
슬라이스로 인해 필요한 것은 없습니다 :s[:index] + c + s[index+1:]
세 가지 방법이 있습니다. 스피드를 찾는 사람들에게는 '방법 2'를 추천합니다
방법 1
이 답변으로 주어진
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
'방법 2'에 비해 속도가 느립니다.
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
방법 2 (빠른 방법)
이 답변으로 주어진
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
훨씬 빠릅니다 :
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
방법 3 :
바이트 배열 :
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
가장 빠른 것 보다 두 배 느립니다.
파이썬 문자열은 변경할 수 없으므로 복사하여 변경합니다.
원하는 것을 수행하는 가장 쉬운 방법은 아마도 다음과 같습니다.
text = "Z" + text[1:]
이 text[1:]
문자열 text
은 위치 1에서 끝까지 문자열을 반환하고 위치는 0부터 카운트하므로 '1'은 두 번째 문자입니다.
편집 : 문자열의 모든 부분에 동일한 문자열 슬라이싱 기술을 사용할 수 있습니다
text = text[:1] + "Z" + text[2:]
또는 글자가 한 번만 나타나는 경우 아래 제안 된 검색 및 바꾸기 기술을 사용할 수 있습니다
python 2.6 및 python 3부터는 변경할 수있는 바이트 배열을 사용할 수 있습니다 (문자열과 달리 요소별로 변경 가능).
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
편집 : str을 s로 변경
edit2 : 주석에서 언급 한 2 비트 연금술사처럼이 코드는 유니 코드와 함께 작동하지 않습니다.
bytearray(s)
, 그렇지 않아야 bytearray(str)
합니다. 다른 경우에는 다음이 생성 TypeError: string argument without an encoding
됩니다.. 인코딩을 지정하면 얻을 수 TypeError: an integer is required
있습니다. 그것은 Python 3 또는 Python 2의 유니 코드입니다. 두 번째 줄이 수정 된 Python 2 에서이 작업을 수행하면 ASCII가 아닌 문자는 1 바이트가 아니기 때문에 작동하지 않습니다. 그것을 시도 s = 'Héllo'
하고 당신은 얻을 것이다 'He\xa9llo'
.
s = u'abcdefg'
.
다른 사람들이 말했듯이 일반적으로 파이썬 문자열은 변경할 수 없습니다.
그러나 python.org에서 구현 한 CPython을 사용하는 경우 ctypes를 사용하여 메모리의 문자열 구조를 수정할 수 있습니다.
다음은이 기술을 사용하여 문자열을 지우는 예입니다.
나는 완전성을 위해 이것을 언급하고, 이것이 해킹이기 때문에 이것이 최후의 수단이되어야합니다.
str
경우 올바른 유형이 아닙니다. 그냥 사용하지 마십시오. bytearray
대신 비슷한 것을 사용하십시오 . (아직도 우연히 데이터를 불투명 한 데이터로 취급 하여 실수로 데이터를 검색 할 수 없도록str
사고에서 보호합니다. 라이브러리는있을 수 있습니다.)
이 코드는 내 것이 아닙니다. 나는 그곳에서 가져온 사이트 양식을 기억하지 못했습니다. 흥미롭게도이 문자를 사용하여 하나 이상의 문자를 하나 이상의 문자로 바꿀 수 있습니다. 이 답변은 매우 늦었지만 나와 같은 초보자는 언제든지 유용 할 수 있습니다.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
실제로 문자열을 사용하면 다음과 같이 할 수 있습니다.
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
기본적으로 새 문자열에 "+"문자열을 함께 추가하고 있습니다 :).
문자열에서 문자를 변경하는 다른 방법을 추가하고 싶습니다.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
문자열을 목록으로 바꾸고 i 번째 값을 바꾸고 다시 결합하는 것과 비교할 때 얼마나 빠릅니까?
접근 방식
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
내 솔루션
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526