2012-03-19 53 views
2

我有一個函數,遞減由字符串表示的整個數字參數。例如,如果我傳入字符串「100」,它應該返回「99」。如何在Python字符串中設置字符?

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]不能被視爲一個左值。什麼是解決方案?

回答

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 
+0

這兩種方法的表現都很糟糕。 – Marcin 2012-03-20 08:12:49

+0

@Marcin經常表現並不重要。很好指出,但。 – 2012-03-20 13:24:57

+0

@MarkRansom性能可怕,代碼複雜。 – Marcin 2012-03-20 13:25:54

0

解決您「遞減」字符串的特定問題的方法是將s轉換爲帶有int(s)的int,然後將其減少並轉換回str:str(int(s)-1)

In [175]: str(int('100')-1) 
Out[175]: '99' 

一般的解決方法是不要試圖改變字符串的元素;使用其他類型來表示您的工作,並將其轉換爲字符串作爲最後一步。

3

你可以這樣做:

s = s[:i] + "9" + s[i+1:] 

這需要字符串的一部分字符索引i之前,附加一個9,然後附加字符串的字符索引i後的部分。但是,像這樣做很多字符串追加並不是非常有效。

另一個答案是,如果你正在處理數字,爲什麼不實際使用數字而不是字符串?

def dec(s): 
    return str(int(s) - 1) 
+1

將字符串轉換爲int然後返回字符串是最簡單的解決方案。 – 2012-03-19 20:45:59

0

Python字符串是不可變的,所以你不能修改它們。您必須創建一個包含您需要的值的新字符串。您最好將字符串轉換爲整數,然後將其遞減,然後再將其轉換回整數。

不可變字符串的原因主要是效率。

0

字符串是不可變的,但名單。您可以輕鬆地將字符串轉換爲單個字符的列表:

l = list(s) 

然後將其轉換回:

s = ''.join(l) 

既然你用數字串有更多直接的方法,但這個答案工作適用於一般情況。

+0

感謝您注意列表的工作! – 2012-03-20 06:26:48

+0

@JohnHoffman,通常的方式來說「謝謝」就是打左邊的向上箭頭!你非常歡迎。編輯:請原諒我,如果你已經upvoted - 它似乎由於某種原因downvote後。 – 2012-03-20 13:13:19

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) 
+1

我很高興你把錯誤檢查。不過,通常最好檢查一下你想要捕捉的具體異常;在這種情況下,「ValueError」。對於快速和髒的檢查,你可以使用'except Exception:',在最近版本的Python中不會捕獲'SystemExit'或'KeyboardInterrupt'。我甚至不知道你可以只說'除了:'而且我不確定它是做什麼的。我只是試了一下,它似乎工作。 – steveha 2012-03-20 01:46:00

相關問題