2012-02-26 24 views

Trả lời

24

Chuỗi không thay đổi. Điều đó có nghĩa là bạn không thể gán cho họ cả. Bạn có thể sử dụng định dạng:

>>> s = 'abc{0}efg'.format('d') 
>>> s 
'abcdefg' 

Hoặc nối:

>>> s = 'abc' + 'd' + 'efg' 
>>> s 
'abcdefg' 

Hoặc thay thế (nhờ Odomontois đã nhắc nhở tôi):

>>> s = 'abc0efg' 
>>> s.replace('0', 'd') 
'abcdefg' 

Nhưng hãy nhớ rằng tất cả các phương pháp tạo sao chép của chuỗi, thay vì sửa đổi nó tại chỗ. Nếu bạn muốn sửa đổi tại chỗ, bạn có thể sử dụng một bytearray - mặc dù điều đó sẽ chỉ hoạt động cho các chuỗi ascii đơn giản, như alexis chỉ ra.

>>> b = bytearray('abc0efg') 
>>> b[3] = 'd' 
>>> b 
bytearray(b'abcdefg') 

Hoặc bạn có thể tạo danh sách các ký tự và thao tác điều đó. Đây có lẽ là cách hiệu quả nhất và chính xác để làm thường xuyên, quy mô lớn chuỗi thao tác:

>>> l = list('abc0efg') 
>>> l[3] = 'd' 
>>> l 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> ''.join(l) 
'abcdefg' 

Và xem xét các mô-đun re cho các hoạt động phức tạp hơn.

Định dạng chuỗi và thao tác danh sách là hai phương pháp có khả năng định dạng chuỗi IMO chính xác và hiệu quả nhất khi chỉ cần một vài lần chèn và liệt kê thao tác khi bạn cần thường xuyên cập nhật chuỗi của mình.

+1

Phương thức str.replace() và re.RegexObject.sub có thể hữu ích. – Odomontois

+0

bytearray có vẻ tốt với tôi, có anyway để chuyển đổi chuỗi thành mảng byte? – w00d

+0

@iKid, trong đoạn mã trên, ''abc0efg'' là một chuỗi, và' bytearray (' abc0efg ') 'chuyển đổi chuỗi đó thành một bytearray. Vì vậy, có :) – senderle

5

Vì chuỗi là "không thay đổi", bạn sẽ có được hiệu ứng chỉnh sửa bằng cách xây dựng phiên bản đã sửa đổi của chuỗi và gán nó trên giá trị cũ. Nếu bạn muốn thay thế hoặc chèn vào một vị trí cụ thể trong chuỗi, cú pháp mảng giống như hầu hết là sử dụng lát:

s = "ABCDEFGH" 
s = s[:3] + 'd' + s[4:] # Change D to d at position 3 

Đó là nhiều khả năng mà bạn muốn thay thế một nhân vật cụ thể hoặc chuỗi với nhau. Đừng rằng với re, một lần nữa thu thập kết quả chứ không phải là sửa đổi tại chỗ:

import re 
s = "ABCDEFGH" 
s = re.sub("DE", "--", s) 
+0

Là một con trăn n00b, đây là chính xác những gì tôi muốn thay đổi một nhân vật ở một vị trí cụ thể. Cảm ơn. –

0

Tôi đoán Object này có thể giúp:

class Charray(list): 

    def __init__(self, mapping=[]): 
     "A character array." 
     if type(mapping) in [int, float, long]: 
      mapping = str(mapping) 
     list.__init__(self, mapping) 

    def __getslice__(self,i,j): 
     return Charray(list.__getslice__(self,i,j)) 

    def __setitem__(self,i,x): 
     if type(x) <> str or len(x) > 1: 
      raise TypeError 
     else: 
      list.__setitem__(self,i,x) 

    def __repr__(self): 
     return "charray['%s']" % self 

    def __str__(self): 
     return "".join(self) 

Ví dụ:

>>> carray = Charray("Stack Overflow") 
>>> carray 
charray['Stack Overflow'] 
>>> carray[:5] 
charray['Stack'] 
>>> carray[-8:] 
charray['Overflow'] 
>>> str(carray) 
'Stack Overflow' 
>>> carray[6] = 'z' 
>>> carray 
charray['Stack zverflow'] 
0
s = "ABCDEFGH" s[1] = 'a' s[-1]='b' 

bạn có thể sử dụng như thế này

s=s[0:1]+'a'+s[2:] 

điều này rất đơn giản hơn các cách phức tạp khác

Các vấn đề liên quan