交换两个字符串时出错

2024-04-24 23:38:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在按字符交换两个字符串时出错。。。你知道吗

代码:

#Exchange names using 2-D array of characters

names=["akshay","parag","raman","srinivas","gopal","rajesh"]

      print "Original:%s %s\n" % (names[2],names[3])

for i in range(0,10,1):
      t=names[2][i]
      names[2][i]=names[3][i]
      names[3][i]=t
      print "New:%s %s\n" % (names[2],names[3])

TypeError: 'str' object does not support item assignment

有什么解决办法吗?你知道吗


Tags: of字符串代码exchangenames字符arrayusing
3条回答

字符串在Python中是不可变的,您可以在此处使用^{}

names = map(bytearray, names)
print "Original:%s %s\n" % (names[2],names[3])
for i in range(10):
    try:
        #That's how we swap items in Python.
        names[2][i],  names[3][i] = names[3][i], names[2][i]
    except IndexError:
        #'raman' will raise error for index 5, so we need to catch that here
        #Do someting here for unequal strings or break
        break

print "New:%s %s\n" % (names[2],names[3])

不能更新字符串,只能使用字符串方法或切片等创建新字符串

更新:

names = map(bytearray, names)
print "Original:%s %s\n" % (names[2],names[3])
s = sorted((names[2], names[3]), key=len)
for i in range(len(s[1])):
    try:
        # Here in case of unequal length string, s[0] is the shorter string
        # and s[1] is the longer one.
        s[0][i], s[1][i] = s[1][i], s[0][i]
    except IndexError:
        for _ in range(i, len(s[1])):
            #remove the items from the longer string and append them to the shorter one.
            s[0].append(s[1].pop(i))            

print "New:%s %s\n" % (names[2],names[3])

还要注意的是bytearray只有在与ASCII字符一起使用时才是好的,不要与非ASCII数据一起使用。你知道吗

如果每个字符串至少包含10个字符,则完全可以不使用循环:

names[2], names[3] = names[3][:10] + names[2][10:], names[2][:10] + names[3][10:]

这会同时完成两个任务。在这之后,names[2]将从位置10开始有names[3]的前10个字母和names[2]的字母。同样的names[3]。你知道吗

names是字符串列表。因此,当您执行names[2][someIndex]操作时,您正在访问该字符串的单个字符。因此,当您执行names[2][i] = names[3][i]操作时,您试图交换两个字符。因为Python字符串是不可变的,所以这不起作用。你知道吗

除此之外,您还尝试访问不存在的字符串的索引。例如names[2]raman,所以有5个字符长。因为您将i循环到9,所以您最终会尝试访问'raman'[5]'raman'[6]'raman'[9],这些都会引发索引器。你知道吗

如果要交换列表中的两个字符串,只需整体交换字符串:

>>> names = ["akshay","parag","raman","srinivas","gopal","rajesh"]
>>> t = names[2]
>>> names[2] = names[3]
>>> names[3] = t

或者简而言之,没有临时变量:

>>> names[2], names[3] = names[3], names[2]

相关问题 更多 >