Cách tốt nhất/chính xác để sử dụng gán mục cho chuỗi python là gì?Cách thay thế cho việc gán mục chuỗi python
tức là s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
Cách thông thường sẽ ném: 'str' object does not support item assignment
Cách tốt nhất/chính xác để sử dụng gán mục cho chuỗi python là gì?Cách thay thế cho việc gán mục chuỗi python
tức là s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
Cách thông thường sẽ ném: 'str' object does not support item assignment
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.
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)
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. –
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']
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
Phương thức str.replace() và re.RegexObject.sub có thể hữu ích. – Odomontois
bytearray có vẻ tốt với tôi, có anyway để chuyển đổi chuỗi thành mảng byte? – w00d
@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