Python 递增字符串中的字符

Python 递增字符串中的字符,python,Python,假设您有一个字符串s和一个整数数组roll。我想根据roll中的数字,将s的每个字母递增1。例如,如果s=“abc”和roll=[1,2],则输出将是s=“ccc” 当我运行下面的代码时,我一直得到原始字符串s这是为什么 def rollTheString(s, roll): for i in range(0, len(roll)): for j in range(0,i): s[j] = (chr(ord(s[j])+1)); return s; 字符串是不

假设您有一个字符串
s
和一个整数数组
roll
。我想根据
roll
中的数字,将
s
的每个字母递增1。例如,如果
s=“abc”
roll=[1,2]
,则输出将是
s=“ccc”

当我运行下面的代码时,我一直得到原始字符串
s
这是为什么

def  rollTheString(s, roll):
  for i in range(0, len(roll)):
     for j in range(0,i):
       s[j] = (chr(ord(s[j])+1));
  return s;

字符串是不可变的,因此不能通过切片来更改它们。您需要创建一个新字符串,最好使用
join
进行理解

from itertools import izip_longest

s = "abc"
roll = [1, 2]

>>> "".join(chr(ord(c) + (n or 0)) for c, n in izip_longest(s, roll))
'bdc'

 # a + 1 = b, b + 2 = d, c + 0 = c
查看您的嵌套循环,您可能正在滚动创建一个排序总和。您甚至不使用
滚动中的值,只使用其长度

我会把你的问题分成两部分:

  • 确定要从
    s
    添加到每个字符的偏移量
  • 使用上面说明的
    join
    方法基于偏移量创建新字符串

字符串是不可变的,因此不能通过切片来更改它们。您需要创建一个新字符串,最好使用
join
进行理解

from itertools import izip_longest

s = "abc"
roll = [1, 2]

>>> "".join(chr(ord(c) + (n or 0)) for c, n in izip_longest(s, roll))
'bdc'

 # a + 1 = b, b + 2 = d, c + 0 = c
查看您的嵌套循环,您可能正在滚动创建一个排序总和。您甚至不使用
滚动中的值,只使用其长度

我会把你的问题分成两部分:

  • 确定要从
    s
    添加到每个字符的偏移量
  • 使用上面说明的
    join
    方法基于偏移量创建新字符串

    • 您得到的错误应该是:

      TypeError: 'str' object does not support item assignment
      
      这是因为Python中的字符串是不可变的,所以不能在适当的位置更改它们的字符

      关于你的问题,考虑下面的代码:

      def rollTheString(s, roll):
          i = 0
          tmp = ''
          while i < len(s):
              ch_offset = roll[i] if ( i < len(roll)) else 0
              tmp += (chr(ord(s[i]) + ch_offset))
              i += 1
          return tmp
      
      newString = rollTheString("abc", [2,1])
      print (newString)
      
      def roll字符串,滚动:
      i=0
      tmp=''
      而我
      您得到的错误应该是:

      TypeError: 'str' object does not support item assignment
      
      这是因为Python中的字符串是不可变的,所以不能在适当的位置更改它们的字符

      关于你的问题,考虑下面的代码:

      def rollTheString(s, roll):
          i = 0
          tmp = ''
          while i < len(s):
              ch_offset = roll[i] if ( i < len(roll)) else 0
              tmp += (chr(ord(s[i]) + ch_offset))
              i += 1
          return tmp
      
      newString = rollTheString("abc", [2,1])
      print (newString)
      
      def roll字符串,滚动:
      i=0
      tmp=''
      而我
      您可以使用此

      def rollTheString(s, roll):
          increment = [0] * len(s)
          a_to_z = [chr(i) for i in range(97, 97 + 26)]
          for num in roll:
              for i in range(num):
                  increment[i] += 1
          result = ""
          for i in range(len(s)):
              index = ord(s[i]) + increment[i] - 97
              index = index % 26
              result += a_to_z[index]
      
          return result
      
      你可以用这个

      def rollTheString(s, roll):
          increment = [0] * len(s)
          a_to_z = [chr(i) for i in range(97, 97 + 26)]
          for num in roll:
              for i in range(num):
                  increment[i] += 1
          result = ""
          for i in range(len(s)):
              index = ord(s[i]) + increment[i] - 97
              index = index % 26
              result += a_to_z[index]
      
          return result
      

      分配给字符串将引发错误,因为它们是不可变的。您应该将其更改为可变类型,如列表或bytearray。
      'abc'
      如何与
      [1,2]
      一起成为
      'ccc'
      ?正如其他注释所述,问题和代码片段根本不匹配-1.@CristiFati:你把第一个字母加1,我们就得到了bbc。然后我们将前两个字母加1得到ccc。@Trevor:我猜这是我们想要的行为。但是,当查看代码时(不运行它),除了抛出的TypeError之外,它只增加第一个字符,结果是
      bbc
      。分配给字符串将抛出一个错误,因为它们是不可变的。您应该将其更改为可变类型,如列表或bytearray。
      'abc'
      如何与
      [1,2]
      一起成为
      'ccc'
      ?正如其他注释所述,问题和代码片段根本不匹配-1.@CristiFati:你把第一个字母加1,我们就得到了bbc。然后我们将前两个字母加1得到ccc。@Trevor:我猜这是我们想要的行为。但是,当查看代码时(不运行它),除了抛出的TypeError之外,它只增加第一个字符,结果是
      bbc