2015-09-28 76 views
0

這裏是我的代碼和錯誤消息,並且在Python中想知道,如果我想將一個字符的值賦給字符串中另一個字符的值,該怎麼做?在字符串中的賦值

錯誤消息:

str[i] = str[i+1] 
TypeError: 'str' object does not support item assignment 

的源代碼:

class Solution(object): 
    def RemoveDupCharacters(self, str): 
     dic = {} 
     for i in range(0,255): 
      dic[i] = 0 

     for i in range(len(str)): 
      if dic[ord(str[i])] == 0: 
       dic[ord(str[i])] = 1 
      str[i] = str[i+1] 
     return str 

if __name__ == "__main__": 
    s = Solution() 
    print s.RemoveDupCharacters('aaaa') 
+1

你的意思是,如果你有字符串「AB」,那麼你想讓它成爲「bb」還是「aa」? – MohitC

+2

就像錯誤說的那樣,你不能這樣做;字符串是不可變的。 –

+3

您不能對字符串進行賦值,因爲它們是不可變的,您可以使用一個列表將字符串存儲爲字符列表,然後在列表上調用join來獲取字符串 –

回答

1

由於字符串是不可變的,所以不能在原地編輯它們。而是使用列表來動態編輯事物。

class Solution(object): 
    def RemoveDupCharacters(self, str): 
     temp_str = [] 
     for i in range(len(str)): 
      if str[i] not in temp_str: 
       temp_str.append(str[i]) 

     return ''.join(temp_str) 

if __name__ == "__main__": 
    s = Solution() 
    print s.RemoveDupCharacters('aaaa') 

警告。上述解決方案將刪除所有重複的字符。例如:

s.RemoveDupCharacters('this is a quick test of removal') 

產量:

this aquckeofrmvl 

注意:如果你想刪除重複,那麼this solution更優雅。

+0

最好不要使用'str'作爲變量名稱。 –

+0

@PadraicCunningham它是一個表示字符串的列表。 – KronoS

+0

不,它是一個變量,指向一個字符串,'RemoveDupCharacters(self,str < - )' –

3

你不能在一個字符串指定的字符。字符串是不可變的。您可以創建具有所需字符的新字符串,也可以使用可變的數據類型。例如,在此解決方案中,您可以在字符串中構建一個字符列表,然後刪除重複項,然後從已清除的列表中重建字符串。

+1

謝謝@Chad,所以我們無法更改部分在Python中的字符串值(字符)? –

+1

@林正確。你只能構造一個新的字符串。一旦構造,字符串對象就不能被修改。 –

1

使用您的代碼和返工它列出了工作,一個代表性的作品是:

class Solution(object): 

    def remove_dup_characters(self, input_string): 
     letters = [] 
     s = [] 
     for c in input_string: 
      if c not in letters: 
       s.append(c) 
       letters.append(c) 
     return "".join(s) 

    def remove_dup_characters2(selfself, input_string): 
     return "".join(set(input_string)) 

if __name__ == "__main__": 
    s = Solution() 
    print s.remove_dup_characters('aaaabbaaa') 
    print s.remove_dup_characters2('bbbbasdopiwerasdawera;lasoisdatatasdas') 

這將產生

ab 
abedilopsrtw; 
+0

感謝您的迴應,是否可以進行各種就地操作以避免爲空間效率創建新字符串? –

+0

沒有辦法影響@Lin Ma原始字符串。這就是我們說的字符串是** immutable **的意思。但我已經添加了另一個def,這可能會爲大字符串提供更好的性能。因人而異。 –