假设您有一个字符串 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;
答案 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