【问题标题】:why my code does not decode the encrypted string based on the dictionary?为什么我的代码没有根据字典解码加密字符串?
【发布时间】:2015-12-24 18:45:04
【问题描述】:

我有一本字典,其中包含表示字母的键和值。

例如一个简单的:

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!"]

它根本不起作用。字符保持不变,代码仍然未知。 我不明白为什么它不起作用,如果有人有时间查看并尝试帮助我看看有什么问题,或者甚至提出更好的方法(有效)。

【问题讨论】:

  • print word_list 将打印您在上面声明的word_list
  • [''.join(DICT_CODE.get(c, c) for c in s) for s in word_list]

标签: python python-2.7 dictionary encryption replace


【解决方案1】:

在 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!']

【讨论】:

    【解决方案2】:

    如 cmets 中所述,@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 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!']
      

      【讨论】:

        猜你喜欢
        • 2021-02-23
        • 2013-04-17
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多