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
。