我有一个减少字符串表示的整数参数的函数。例如,如果我传入字符串“100”,它应该返回“99”。
def dec(s):
i = len(s) - 1
myString = ""
while (i >= 0):
if s[i] == '0':
s[i] = '9'
i -= 1
else:
s[i] = chr(int(s[i]) - 1)
break
return s
但是,Python会发出此错误。
s[i] = '9'
TypeError: 'str' object does not support item assignment
我假设s[i]
不能被视为左值。围绕这个解决方案是什么?
答案 0 :(得分:3)
你可以这样做:
s = s[:i] + "9" + s[i+1:]
这将在字符索引i
之前获取字符串的一部分,附加9
,然后在字符索引i
之后附加字符串的一部分。但是,像这样做很多字符串追加并不是非常有效。
另一个答案是,如果您正在处理数字,为什么不实际使用数字而不是字符串?
def dec(s):
return str(int(s) - 1)
答案 1 :(得分:1)
你做不到。在Python中,字符串是不可变的 - 一旦创建,它们就无法更改。
您可以在不完全更改功能的情况下使用两个选项。
将字符串转换为列表并返回:
def dec(s):
s = list(s)
i = len(s) - 1
myString = ""
while (i >= 0):
if s[i] == '0':
s[i] = '9'
i -= 1
else:
s[i] = chr(int(s[i]) - 1)
break
return ''.join(s)
每次要进行更改时都要创建一个新字符串:
def dec(s):
i = len(s) - 1
myString = ""
while (i >= 0):
if s[i] == '0':
s = s[:i] + "9" + s[i+1:]
i -= 1
else:
s = s[:i] + chr(int(s[i]) - 1) + s[i+1:]
break
return s
答案 2 :(得分:1)
我不确定你为什么要逐字逐句地使用字符串。这不是更简单吗?
def decrement_string(s):
try:
i = int(s)
i = i - 1
return str(i)
except:
# do something else
return "that's no number!"
while True:
s = raw_input("give me a number and I'll decrement it for you: ")
print decrement_string(s)
答案 3 :(得分:0)
“减少”字符串的特定问题的解决方案是将s
转换为带int(s)
的int,减少该值,然后转换回str:str(int(s)-1)
。
In [175]: str(int('100')-1)
Out[175]: '99'
一般的解决方案是不要试图改变字符串的元素;使用其他类型来表示你的工作,并转换为字符串作为最后一步。
答案 4 :(得分:0)
Python字符串是不可变的,因此您无法修改它们。您必须创建一个包含所需值的新字符串。你最好将字符串转换为整数,递减它,然后再将其转换回整数。
不可变字符串的原因主要是效率。
答案 5 :(得分:0)
字符串不可变,但列表是。您可以轻松地将字符串转换为单个字符列表:
l = list(s)
然后将其转换回来:
s = ''.join(l)
由于您正在使用数字字符串,因此有更多直接方法,但这个答案适用于一般情况。