2015-09-27 44 views
3

我有一個代表字母的鍵和值的字典。爲什麼我的代碼不能解碼基於字典的加密字符串?

例如簡單:

DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y'} 

我接收到的加密的代碼並把該字符串到一個列表,其中每個項目是一個字。根據字典中的條目,我需要解決它。

的代碼的例子是:

words_list = ["bppx","xnt!"] # "good day!" 

我試着用雙for循環來解決這個問題,如下:

for word in words_list: 
    for char in word: 
     if char in string.letters: 
      word = word.replace(char, DICT_CODE.get(char)) 
print words_list 

預期輸出 - >["good","day!"]

輸出 - >["bppx","xnt!"]

它不工作在一個二。 charcaters保持不變,代碼仍然未知。 我不明白爲什麼它不工作,如果有人有時間看,並嘗試幫助我,看看有什麼不對,甚至建議更好的方法(工程)。

+1

'打印word_list'將打印'word_list'你上面聲明。 – marmeladze

+1

'[''.join(DICT_CODE.get(c,c)for c in s)for s in word_list]' –

回答

1

你的問題是你實際上並沒有修改原始列表。

for i, word in enumerate(words_list): 
    for char in word: 
     if char in string.letters: 
      word = word.replace(char, DICT_CODE.get(char)) 
      words_list[i] = word 

print words_list 

['good', 'day!'] 
1

正如在評論中提到的,@marmeladze,print word_list will打印您上述聲明的word_list

你想要什麼,是這樣的:

DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y', '!': '!'} 

words_list = ["bppx","xnt!"] 

decoded_list = [] 

for word in words_list: 

    for char in word:  
      word = word.replace(char, DICT_CODE.get(char)) 
    decoded_list.append(word) 

print decoded_list 

輸出

['good', 'day!'] 

希望這有助於。

3

更改for循環中的word變量不會更改word_list中的字符串。你需要記住的索引並更新索引處的元素(以及從索引字) -

for i, word in enumerate(words_list): 
    for char in word: 
      if char in string.letters: 
        words_list[i] = words_list[i].replace(char, DICT_CODE.get(char)) 

演示 -

>>> words_list = ["bppx","xnt!"] 
>>> DICT_CODE = {'b' : 'g', 'n' :'a', 'p' : 'o', 'x' : 'd', 't' : 'y'} 
>>> for i, word in enumerate(words_list): 
...  for char in word: 
...    if char in string.letters: 
...      words_list[i] = words_list[i].replace(char, DICT_CODE.get(char)) 
>>> words_list 
['good', 'day!'] 

但你一個更簡單的方法是要使用str.translate(以及string.maketrans)。示例 -

table = string.maketrans('bnpxt','gaody') #First argument characters in your original string, and second argument what they map to. 
for i, word in enumerate(words_list): 
    words_list[i] = word.translate(table) 

演示 -

>>> import string 
>>> table = string.maketrans('bnpxt','gaody') #This creates the translation table 
>>> words_list = ["bppx","xnt!"] 
>>> for i, word in enumerate(words_list): 
...  words_list[i] = word.translate(table) 
... 
>>> print words_list 
['good', 'day!'] 

此使用列表解析 -

words_list[:] = [word.translate(table) for word in words_list] 

演示 -

>>> words_list = ["bppx","xnt!"] 
>>> table = string.maketrans('bnpxt','gaody') 
>>> words_list[:] = [word.translate(table) for word in words_list] 
>>> words_list 
['good', 'day!'] 
相關問題