Yanıtlar:
Dizeleri değiştirmeyin.
Onlarla liste halinde çalışın; bunları yalnızca gerektiğinde dizgilere dönüştürün.
>>> 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 dizeleri değiştirilemez (yani değiştirilemez). Bunun birçok nedeni var. Başka seçeneğiniz kalmayıncaya kadar listeleri kullanın, ancak bunları dizelere dönüştürün.
MID
Dilimler gibi şeylere gerek yoktur :s[:index] + c + s[index+1:]
Üç yol var. Hız arayanlar için 'Yöntem 2'yi öneriyorum
Yöntem 1
Bu cevap tarafından verildi
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Bu, 'Yöntem 2'ye kıyasla oldukça yavaş
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Yöntem 2 (HIZLI YÖNTEM)
Bu cevap tarafından verildi
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Hangisi çok daha hızlı:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Yöntem 3:
Bayt dizisi:
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)
en hızlı olanın iki katı kadar yavaştır.
new = text[:1] + 'Z' + text[2:]
Python dizeleri değişmezdir, bir kopya yaparak değiştirebilirsiniz.
İstediğinizi yapmanın en kolay yolu muhtemelen:
text = "Z" + text[1:]
Dizeyi text[1:]
döndürürtext
uç konum 1, konumlar bu yüzden '1' ikinci karakter 0 ila sayısı.
edit: Dizenin herhangi bir bölümü için aynı dize dilimleme tekniğini kullanabilirsiniz
text = text[:1] + "Z" + text[2:]
Veya harf yalnızca bir kez görünüyorsa, aşağıda önerilen arama ve değiştirme tekniğini kullanabilirsiniz
Python 2.6 ve python 3 ile başlayarak değiştirilebilir olan bytearray'leri kullanabilirsiniz (dizelerden farklı olarak element olarak değiştirilebilir):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
edit: str s olarak değiştirildi
edit2: İki Bit Simyacı yorumlarda belirtildiği gibi, bu kod unicode ile çalışmaz.
bytearray(s)
, değil bytearray(str)
. Bir başka açıdan, bu üretecek: TypeError: string argument without an encoding
. Bir kodlama belirtirseniz, alırsınız TypeError: an integer is required
. Bu Python 3 veya Python 2'nin unicode'u ile. Bunu Python 2'de (düzeltilmiş ikinci bir satırla) yaparsanız, ASCII olmayan karakterler için çalışmaz, çünkü bunlar sadece bir bayt olmayabilir. Deneyin s = 'Héllo'
ve alacaksınız 'He\xa9llo'
.
s = u'abcdefg'
.
Diğer insanların söylediği gibi, genellikle Python dizelerinin değişmez olması gerekiyordu.
Ancak, python.org'daki uygulama olan CPython kullanıyorsanız, bellekteki dize yapısını değiştirmek için ctypes kullanmak mümkündür.
İşte bir dizeyi temizlemek için tekniği kullandığım bir örnek.
Python'da verileri hassas olarak işaretleme
Bütünlük uğruna bundan bahsediyorum ve hackish olduğu için bu son çare olmalı.
str
, sizin için doğru tür değildir. Sadece kullanma. bytearray
Bunun gibi bir şey kullanın. (Daha da iyisi, size gerçekten o kadar opak bir veri olarak az ya da çok tedavi sağlayan bir şeyin içine sarın edemez bir almak str
, ondan kazalara karşı korumak için. O. Hiçbir fikri için bir kütüphane olabilir.)
Bu kod benim değil. Nerede aldığımı site formunu hatırlayamıyordum. İlginç bir şekilde, bunu bir veya daha fazla karakteri bir veya daha fazla karakterle değiştirmek için kullanabilirsiniz. Bu cevap çok geç olsa da, benim gibi acemiler (her zaman) yararlı bulabilir.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
.
Aslında, dizelerle böyle bir şey yapabilirsiniz:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Temel olarak, yeni bir dizeye "+" dizeleri "ekliyorum :).
dünyanız% 100 ise ascii/utf-8
(bu kutuya birçok kullanım durumu sığar):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
python 3.7.3
Bir dizede bir karakteri değiştirmenin başka bir yolunu eklemek istiyorum.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
Dizeyi listeye dönüştürmek ve ith değerini değiştirmek ve tekrar katılmakla karşılaştırıldığında ne kadar hızlı?
Liste yaklaşımı
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Çözümüm
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526