2013-06-27 213 views
1

我想讓代碼打破遊戲,其中用戶提交符號/字母對字典來破解代碼,然後我希望代碼使用字典來用配對的字母替換符號的每個實例。python使用字典替換字符串列表中的字符

我有下面的代碼位:

words = imported list of coded words where each letter is replaced by a symbol. from a text file so i can change later 
clues = dictionary of symbol and letter pairs that can be added to, removed from 

我曾嘗試以下,但它失敗:TypeError: list indices must be integers, not str

def converter(words,clues): 

    progression = words 


    for words in progression:#cycles through each coded word in the list 
     for key in clues: #for each symbol in the dictionary 
      progression[words] = progression[words].replace(key, clues[key]) #replaces 


    return progression 

任何幫助,任何人都可以提供我將非常感激。

亞當

+0

對於許多不同的事情,你正在重複使用相同的變量名,避免這種情況。另外 - 你提到字典,但只使用列表。 –

回答

2

progression是一個列表。要訪問它的內容,你需要使用索引值,這是一個整數,而不是一個字符串,因此是錯誤。

你可能想:

for i, j in enumerate(words): 
    words[i] = clues.get(j) 

什麼枚舉所做的是通過文字的列表,其中i是索引值和j爲內容的循環。 .get()dict['key']類似,但如果未找到密鑰,則返回None而不是引發錯誤。

然後words[i]修改與字

1

Haidro解釋它很好的索引號的名單,但我想我會擴大自己的代碼,同時也解決另一個問題。

首先,正如Inbar Rose指出的那樣,您的命名約定很糟糕。它使代碼讀取,調試和維護困難得多。選擇簡潔的描述性名稱,並確保按照PEP-8。避免重複使用相同的變量名稱來處理不同的事情,尤其是在相同的範圍內。

現在,代碼:

words = ['Super', 'Random', 'List'] 
clues = {'R': 'S', 'd': 'r', 'a': 'e', 'o': 'e', 'm': 't', 'n': 'c'} 


def decrypter(words, clues): 

    progression = words[:] 

    for i, word in enumerate(progression): 
     for key in clues: 
      progression[i] = progression[i].replace(key, clues.get(key)) 

    return progression 

這在現在的progression[i],而不是從clues鑰匙更換progression[i]內容替換字符。

此外,將progression = words更改爲progression = words[:]以便創建要採取行動的列表的副本。你傳入一個單詞的引用,然後將相同的引用分配給進程。當你操縱progression,所以你要操縱words,渲染progression無用的在這種情況下。

實施例使用:

print words 
print decrypter(words, clues) 
print words 

使用progression = words輸出:

[ '超級', '隨機', '列']
[ '超級', '祕密',「列表使用']
[' 超級」, '祕密', '列']

輸出:

[ '超級', '隨機', '列']
[ '超級', '祕密', '列']
[ '超級', '隨機', '名單' ]