增加字符串

时间:2017-08-25 19:50:51

标签: python

假设您有一个字符串 s 和一个整数数组 roll 。我想将 s 的每个字母增加1,具体取决于 roll 中的数字。例如,如果 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;

3 个答案:

答案 0 :(得分:1)

字符串是不可变的,因此您无法通过切片来更改它们。您需要创建一个新字符串,最好通过使用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

查看您的嵌套循环,您可能会在卷上创建一个类别的cumsum。您甚至似乎都没有使用roll中的值,只是它的长度。

我会将您的问题分成两部分:

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

答案 1 :(得分:1)

你得到的错误应该是:

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)

答案 2 :(得分:1)

您可以使用此

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