Câu trả lời:
Đừng sửa đổi chuỗi.
Làm việc với họ như danh sách; biến chúng thành chuỗi chỉ khi cần thiết.
>>> 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'
Chuỗi Python là bất biến (tức là chúng không thể được sửa đổi). Có rất nhiều lý do cho việc này. Sử dụng danh sách cho đến khi bạn không có lựa chọn, chỉ sau đó biến chúng thành chuỗi.
MID
do lát:s[:index] + c + s[index+1:]
Có ba cách. Đối với những người tìm kiếm tốc độ, tôi khuyên dùng 'Phương pháp 2'
Phương pháp 1
Đưa ra bởi câu trả lời này
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Điều này khá chậm so với 'Phương pháp 2'
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Phương pháp 2 (PHƯƠNG PHÁP NHANH CHÓNG)
Đưa ra bởi câu trả lời này
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Cái nào nhanh hơn nhiều:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Cách 3:
Mảng byte:
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)
gấp đôi so với phương pháp nhanh nhất.
new = text[:1] + 'Z' + text[2:]
Chuỗi Python là bất biến, bạn thay đổi chúng bằng cách tạo một bản sao.
Cách dễ nhất để làm những gì bạn muốn có lẽ là:
text = "Z" + text[1:]
Chuỗi text[1:]
trả về chuỗi text
từ vị trí 1 đến cuối, vị trí được tính từ 0 nên '1' là ký tự thứ hai.
chỉnh sửa: Bạn có thể sử dụng cùng một kỹ thuật cắt chuỗi cho bất kỳ phần nào của chuỗi
text = text[:1] + "Z" + text[2:]
Hoặc nếu chữ cái chỉ xuất hiện khi bạn có thể sử dụng kỹ thuật tìm kiếm và thay thế được đề xuất bên dưới
Bắt đầu với python 2.6 và python 3, bạn có thể sử dụng các phụ bản có thể thay đổi (có thể thay đổi thành phần không giống như chuỗi):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
chỉnh sửa: Thay đổi str thành s
edit2: Như Nhà giả kim hai bit được đề cập trong các bình luận, mã này không hoạt động với unicode.
bytearray(s)
, không bytearray(str)
. Đối với người khác, điều này sẽ tạo ra : TypeError: string argument without an encoding
. Nếu bạn chỉ định một mã hóa, sau đó bạn nhận được TypeError: an integer is required
. Đó là với unicode của Python 3 hoặc Python 2. Nếu bạn làm điều này trong Python 2 (với một dòng thứ hai đã được sửa), nó sẽ không hoạt động đối với các ký tự không phải ASCII vì chúng có thể không chỉ là một byte. Hãy thử nó s = 'Héllo'
và bạn sẽ nhận được 'He\xa9llo'
.
s = u'abcdefg'
.
Giống như những người khác đã nói, nói chung các chuỗi Python được coi là bất biến.
Tuy nhiên, nếu bạn đang sử dụng CPython, việc triển khai tại python.org, có thể sử dụng ctypes để sửa đổi cấu trúc chuỗi trong bộ nhớ.
Dưới đây là một ví dụ nơi tôi sử dụng kỹ thuật để xóa một chuỗi.
Đánh dấu dữ liệu là nhạy cảm trong python
Tôi đề cập đến điều này vì mục đích hoàn chỉnh, và đây sẽ là giải pháp cuối cùng của bạn vì nó là hackish.
str
thì đó không phải là loại phù hợp với bạn. Chỉ không sử dụng nó. Sử dụng một cái gì đó như bytearray
thay thế. (Tốt hơn hết, hãy bọc nó trong một cái gì đó cho phép bạn coi nó ít nhiều là dữ liệu mờ để bạn thực sự không thể lấy dữ liệu str
từ nó, để bảo vệ bạn khỏi các tai nạn.
Mã này không phải của tôi. Tôi không thể nhớ lại mẫu trang web ở đâu, tôi đã lấy nó. Thật thú vị, bạn có thể sử dụng điều này để thay thế một nhân vật trở lên bằng một hoặc nhiều nhà từ thiện. Mặc dù câu trả lời này rất muộn, những người mới như tôi (bất cứ lúc nào) có thể thấy nó hữu ích.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Liên kết đến tài liệu
Trên thực tế, với các chuỗi, bạn có thể làm một cái gì đó như thế này:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Về cơ bản, tôi đang "thêm" + "chuỗi" lại với nhau thành một chuỗi mới :).
Tôi muốn thêm một cách khác để thay đổi một ký tự trong chuỗi.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
Làm thế nào nhanh hơn khi so sánh với việc biến chuỗi thành danh sách và thay thế giá trị thứ i sau đó tham gia lại?.
Danh sách tiếp cận
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Giải pháp của tôi
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526