【问题标题】:I'm trying to replace a character in Python while iterating over a string and but it doesn't work我试图在迭代字符串时替换 Python 中的一个字符,但它不起作用
【发布时间】:2017-04-26 12:02:34
【问题描述】:

这是我目前拥有的代码:

letter = raw_input("Replace letter?")
traversed = raw_input("Traverse in?")
replacewith = raw_input("Replace with?")
traverseint = 0
for i in traversed:
    traverseint = traverseint + 1
    if i == letter:
        traversed[traverseint] = replacewith
        print i
print(traversed)

【问题讨论】:

  • 好吧?除了代码之外,您没有显示任何内容。问“为什么我的代码不起作用”的问题是题外话。您应该考虑编辑您的问题以显示所需的输出和实际输出,显示您遇到的问题等。

标签: python string python-2.7 loops for-loop


【解决方案1】:

python 中的str 本质上是不可变的。这意味着,您不能修改现有对象。例如:

>>> 'HEllo'[3] = 'o'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

为了替换字符串中的字符,理想的方法是使用str.replace() 方法。例如:

>>> 'HEllo'.replace('l', 'o')
'HEooo'

不使用str.replace(),你可以使用临时字符串来运行你的程序:

my_str = ''  # Temporary string

for i in traversed:
    # traverseint = traverseint + 1      # Not required
    if i == letter:
        i = replacewith
    my_str += i 

这里my_str 将保存转换后的traversed 的值。或者,更好的方法是将字符串转换为list(如@chepner 所述),更新列表的值,最后加入list 以取回字符串。例如:

traversed_list = list(traversed)

for i, val in enumerate(traversed_list):
    if val == letter:
        traversed_list[i] = replacewith
        print i

my_str = ''.join(traversed_list)

【讨论】:

  • 更好的方法是将ireplacewith 添加到一个列表中(这是可变的),然后在循环完成后调用my_str = ''.join(new_list),以避免每次创建新的字符串对象使用+=
  • 也许还可以将 OP 指向语言理解/生成器的强大功能:''.join(i if i != replacewith else replacewith for i in traversed)
【解决方案2】:

您不应修改正在迭代的容器。而且你不能按位置编辑字符串。

先将字符串复制一份,并使其成为列表对象

letter = raw_input("Replace letter?")
traversed = raw_input("Traverse in?")
modify = list(traversed)
replacewith = raw_input("Replace with?")
for traverseint,i in enumerate(modify): 
    if i == letter:
        modify[traverseint] = replacewith
        print i 
print(''.join(modify))

【讨论】:

    【解决方案3】:

    您也可以只创建空字符串并添加字母(python 3.5)

    letter = input("Replace letter?")
    traversed = input("Traverse in?")
    replacewith = input("Replace with?")
    temp = ''
    for i in traversed:
        if i == letter:
            temp += replacewith
        else:
            temp += i
    
    print(temp)
    

    【讨论】:

      【解决方案4】:

      我还不能发表评论,但想在 Moinuddin Quadri 的回答中添加一些内容。

      如果不需要替换索引,str.replace() 应该是最佳解决方案。 如果需要替换索引,只需使用str.index() 或 str.find() 来确定替换索引,然后使用切片(见表)“剪切”结束并在开始和结束之间求和替换,或者只调用 str.replace( )。

      while True:
          index = traversed.find(letter)
          if index < 0:
              break
          print index
          traversed = traversed[:index] + replacewith + traversed[index + len(letter):]
          #or
          traversed = traversed.replace(letter, replacewith, 1)
      

      Str 是不可变的,因此无法直接分配切片。 如果你想直接修改一个字符串,你应该使用一个可变类型,比如bytearray

      要检查字符串是否包含子字符串,您可以使用in

      letter in traversed
      

      “系统”不允许我发布超过 2 个链接。但是我提到的所有方法都在同一页面上。

      【讨论】:

        【解决方案5】:

        我们也可以像下面这样定义自己的替换:

        def replace(str, idx, char):
            if -1 < idx < len(str):
                return '{str_before_idx}{char}{str_after_idx}'.format(
                    str_before_idx=str[0:idx], 
                    char=char,
                    str_after_idx=str[idx+1:len(str)]
                )
            else:
                raise IndexError
        

        其中str 是要操作的字符串,idx 是索引,char 是要在索引idx 处替换的字符。

        【讨论】:

          猜你喜欢
          • 2021-05-26
          • 2019-07-18
          • 2016-02-03
          • 1970-01-01
          • 2015-06-24
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多