2014-11-03 95 views
3

我對Python很陌生,所以如果這是一個愚蠢的錯誤,請原諒我!Python錯誤TypeError:字符串索引必須是整數

我一直在密碼生成器工作,目前在科技俱樂部。它的工作原理是它要求你輸入一個單詞。你輸入的單詞變成了一個列表。然後它將列表中的每個字母更改爲其他內容以創建唯一密碼(這是有缺陷的,我知道)。當我運行代碼時,它說TypeError: string indices must be integers。我的代碼有什麼問題?

print ("Leo's Password Generator") 
print ('Please enter a word') 
word = input() 


print ('Enter another word:') 
word2 = input() 
word = word2 + word 
word.split() 

def print_list(toon): 
    for i in toon: 
     if toon[i] == 'e': 
      toon[i] = '0' 


print_list(word) 
print (word) 
+1

根據你對furkle的回答的評論,我已經編輯了你的文章一點點,以澄清你的預期行爲。如果我歪曲了你,請告訴我! – 2014-11-03 23:58:49

回答

0

For loop已經給你下一個可用的項目的。在你的情況下,i不是索引,它是本身。

但是,如果你想達到這兩個指標和值,可以使用enumerate

def print_list(toon): 
    for i, ch in enumerate(toon): 
     if ch == 'e': 
      toon = toon[:i] + '0' + toon[i+1:] 

    print(toon) 

,或者你可以在傳統的方法遍歷字符串:

def print_list(toon): 
    for i in range(len(toon)): 
     if toon[i] == 'e': 
      toon = toon[:i] + '0' + toon[i+1:] 

    print(toon) 

編輯: 正如@furkle指出,因爲stringsimmutable,他們不能使用索引進行更改。所以使用串聯或者replace方法。

+1

這根本不起作用 - 你不能在python中重新分配一個字符串的索引。 – furkle 2014-11-03 23:41:17

+0

很酷。我不是那個沮喪的人,所以我不能扭轉它,但請注意,用戶可能不清楚他們打算做什麼。據他們說,他們可能想要通過一個列表而不是一個字符串。 – furkle 2014-11-03 23:50:37

+0

這並沒有造成任何錯誤,但它並沒有改變e的值爲0的 – LeoLinden 2014-11-03 23:53:37

1

問題是你傳遞一個字符串到print_list。當你遍歷一個字符串時,它將它分解爲單字符字符串。所以,基本上你在做的是調用toon['a'],這是行不通的,因爲你必須使用一個整數來訪問按索引迭代。

請注意,你和Batuhan在處理字符串的方式上犯了錯誤。即使您修復上述錯誤,您仍然會在之後立即獲得另一個。在python中,string不允許項目分配,因此您將不得不創建一個全新的字符串,而不是重新分配其中的一個字符。

如果您願意,您可以使用列表理解功能在很小的空間內完成相同的任務。這裏有一個例子:

def print_list(toon): 
    return ''.join([ch if ch != 'e' else '0' for ch in toon]) 

這將創建椿一個新的字符串,其中「E」的所有發生率都換成了「0」,和所有非'E」字符作爲前離開。

編輯:我可能誤解了你的目的。 word.split()作爲聲明的全部內容不會做任何事 - split不會重新分配,並且如果您希望在該聲明之後將字符串列表等同,那麼您必須執行word = word.split()。但是 - 是否有一個原因是你試圖首先拆分字符串?爲什麼要將兩個單獨的單詞分配給一個名爲word的變量?這沒有任何意義,並且使我們很難說出你想要完成的事情。

+0

@LeoLinden如果你願意,你可以這樣做,或者像Batuhan說的那樣,你可以使用'enumerate'來獲取任何給定索引處的字符以及該索引的整數。但是如果你看第二段,那不會解決你的方法,因爲你不能通過python中的字符串索引重新分配字符。 – furkle 2014-11-03 23:40:21

+0

你不需要你的'join'中的內部一次性列表:你可以在那裏使用一個生成器表達式。 '''.join(ch ch if ...)' – 2014-11-03 23:42:39

+0

好的...現在我在掃描錯誤時收到EOL – LeoLinden 2014-11-03 23:42:50

相關問題