Jawaban:
Jangan modifikasi string.
Bekerja dengan mereka sebagai daftar; mengubahnya menjadi string hanya saat dibutuhkan.
>>> 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'
String python tidak dapat diubah (artinya tidak dapat dimodifikasi). Ada banyak alasan untuk ini. Gunakan daftar sampai Anda tidak punya pilihan, hanya kemudian mengubahnya menjadi string.
MID
karena irisan:s[:index] + c + s[index+1:]
Ada tiga cara. Untuk pencari kecepatan saya sarankan 'Metode 2'
Metode 1
Diberikan oleh jawaban ini
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Yang cukup lambat dibandingkan dengan 'Metode 2'
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Metode 2 (METODE CEPAT)
Diberikan oleh jawaban ini
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Yang jauh lebih cepat:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Metode 3:
Array 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)
dua kali lebih lambat dari yang tercepat.
new = text[:1] + 'Z' + text[2:]
String python tidak dapat diubah, Anda mengubahnya dengan membuat salinan.
Cara termudah untuk melakukan apa yang Anda inginkan mungkin:
text = "Z" + text[1:]
The text[1:]
return string dalam text
dari posisi 1 sampai akhir, posisi menghitung dari 0 sehingga '1' adalah karakter kedua.
sunting: Anda dapat menggunakan teknik mengiris string yang sama untuk setiap bagian dari string
text = text[:1] + "Z" + text[2:]
Atau jika surat itu hanya muncul setelah Anda dapat menggunakan teknik pencarian dan ganti yang disarankan di bawah ini
Dimulai dengan python 2.6 dan python 3 Anda dapat menggunakan bytearrays yang bisa berubah-ubah (dapat diubah elemen-bijaksana seperti string):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
edit: Mengubah str ke s
sunting2: Seperti Alchemist Dua-Bit yang disebutkan dalam komentar, kode ini tidak bekerja dengan unicode.
bytearray(s)
, bukan bytearray(str)
. Untuk yang lain, ini akan menghasilkan: TypeError: string argument without an encoding
. Jika Anda menentukan penyandian, maka Anda mendapatkan TypeError: an integer is required
. Itu dengan unicode Python 3 atau Python 2. Jika Anda melakukan ini di Python 2 (dengan baris kedua yang diperbaiki), itu tidak akan berfungsi untuk karakter non-ASCII karena mereka mungkin tidak hanya satu byte. Cobalah s = 'Héllo'
dan Anda akan mendapatkannya 'He\xa9llo'
.
s = u'abcdefg'
.
Seperti orang lain katakan, umumnya string Python seharusnya tidak berubah.
Namun, jika Anda menggunakan CPython, implementasinya di python.org, dimungkinkan untuk menggunakan ctypes untuk memodifikasi struktur string dalam memori.
Berikut adalah contoh di mana saya menggunakan teknik ini untuk menghapus string.
Tandai data sebagai sensitif dalam python
Saya menyebutkan ini demi kelengkapan, dan ini harus menjadi pilihan terakhir Anda karena peretasan.
str
bukan jenis yang tepat untuk Anda. Hanya saja, jangan menggunakannya. Gunakan sesuatu seperti bytearray
sebagai gantinya. (Lebih baik lagi, bungkus dengan sesuatu yang memungkinkan Anda memperlakukannya kurang lebih sebagai data buram sehingga Anda benar - benar tidak dapat mengambilnya str
, untuk melindungi Anda dari kecelakaan. Mungkin ada perpustakaan untuk itu. Tidak ada perpustakaan.)
Kode ini bukan milikku. Saya tidak dapat mengingat bentuk situs di mana, saya membawanya. Menariknya, Anda dapat menggunakan ini untuk mengganti satu karakter atau lebih dengan satu atau lebih karakter. Meskipun balasan ini sangat terlambat, pemula seperti saya (kapan saja) mungkin merasa bermanfaat.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Tautan ke doc
Sebenarnya, dengan string, Anda dapat melakukan sesuatu seperti ini:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Pada dasarnya, saya "menambahkan" + "string" menjadi string baru :).
jika dunia Anda 100% ascii/utf-8
(banyak kasus penggunaan cocok di dalam kotak itu):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
python 3.7.3
Saya ingin menambahkan cara lain untuk mengubah karakter dalam sebuah string.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
Seberapa cepat jika dibandingkan dengan mengubah string menjadi daftar dan mengganti nilai h lalu bergabung kembali ?.
Mendaftar pendekatan
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Solusi saya
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526