วิธีที่ง่ายที่สุดใน Python ในการแทนที่อักขระในสตริงคืออะไร?
ตัวอย่างเช่น:
text = "abcdefg";
text[1] = "Z";
^
วิธีที่ง่ายที่สุดใน Python ในการแทนที่อักขระในสตริงคืออะไร?
ตัวอย่างเช่น:
text = "abcdefg";
text[1] = "Z";
^
คำตอบ:
อย่าแก้ไขสตริง
ทำงานกับพวกเขาเป็นรายการ เปลี่ยนเป็นสตริงได้เมื่อจำเป็นเท่านั้น
>>> 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 คุณสามารถใช้ bytearrays ซึ่งไม่แน่นอน (สามารถเปลี่ยนแปลงองค์ประกอบที่ไม่เหมือนกับสตริง):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
แก้ไข: เปลี่ยน str เป็น s
แก้ไข 2: ตามที่นักเล่นแร่แปรธาตุ Two-Bit กล่าวถึงในความคิดเห็นรหัสนี้ไม่สามารถทำงานกับยูนิโค้ด
bytearray(s)
bytearray(str)
อีกสิ่งนี้จะผลิต: TypeError: string argument without an encoding
. TypeError: an integer is required
หากคุณระบุการเข้ารหัสแล้วคุณจะได้รับ นั่นคือด้วย Unicode ของ Python 3 หรือ Python 2 หากคุณทำสิ่งนี้ใน Python 2 (ด้วยบรรทัดที่สองที่แก้ไข) มันจะไม่ทำงานสำหรับอักขระที่ไม่ใช่ ASCII เพราะอาจไม่ใช่เพียงหนึ่งไบต์ ลองกับและคุณจะได้รับs = 'Héllo'
'He\xa9llo'
s = u'abcdefg'
ดู
เช่นเดียวกับคนอื่น ๆ ที่บอกว่าโดยทั่วไปแล้วสตริงของ Python นั้นควรจะไม่เปลี่ยนรูป
อย่างไรก็ตามหากคุณใช้ CPython การใช้งานที่ python.org เป็นไปได้ที่จะใช้ ctypes เพื่อปรับเปลี่ยนโครงสร้างสตริงในหน่วยความจำ
นี่คือตัวอย่างที่ฉันใช้เทคนิคเพื่อล้างสตริง
ทำเครื่องหมายข้อมูลว่าละเอียดอ่อนในไพ ธ อน
ฉันพูดถึงเรื่องนี้เพื่อความสมบูรณ์และนี่ควรจะเป็นทางเลือกสุดท้ายของคุณเพราะมันแฮ็ค
str
ไม่ใช่ประเภทที่เหมาะสมสำหรับคุณ อย่าใช้มัน ใช้สิ่งที่ชอบbytearray
แทน (ยังดีกว่าห่อในสิ่งที่ช่วยให้คุณปฏิบัติมากกว่าหรือน้อยกว่าเป็นข้อมูลทึบเพื่อให้คุณไม่สามารถเรียกคืนstr
จากมันเพื่อปกป้องคุณจากอุบัติเหตุจริง ๆ อาจมีห้องสมุดสำหรับที่ไม่มีความคิด)
รหัสนี้ไม่ใช่ของฉัน ฉันจำคืนฟอร์มของเว็บไซต์ไม่ได้ ที่น่าสนใจคุณสามารถใช้สิ่งนี้เพื่อแทนที่หนึ่งตัวละครหรือมากกว่าด้วยหนึ่งหรือมากกว่า charectors แม้ว่าการตอบกลับนี้จะช้ามากสามเณรอย่างฉัน (ทุกเวลา) อาจพบว่ามีประโยชน์
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
ครั้งแรก mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
ใช้ได้ ลิงก์ไปยัง doc
ที่จริงแล้วด้วยสตริงคุณสามารถทำสิ่งนี้:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
โดยพื้นฐานแล้วฉัน "เพิ่ม" + "สตริง" ร่วมกันเป็นสตริงใหม่ :)
หากโลกของคุณ 100% ascii/utf-8
(กรณีการใช้งานจำนวนมากพอดีในกล่องนั้น):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
หลาม 3.7.3
ฉันต้องการเพิ่มวิธีอื่นในการเปลี่ยนอักขระในสตริง
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
เมื่อเทียบกับการเปลี่ยนสตริงให้เป็นรายการและแทนที่ค่า ith จากนั้นจึงเข้าร่วมอีกครั้ง
รายการวิธีการ
>>> 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