【问题标题】:is there any simpler coding in python for encoding and decoding using dictionary data structurepython中有没有更简单的编码来使用字典数据结构进行编码和解码
【发布时间】:2019-11-12 08:58:25
【问题描述】:

这里的概念是使用字典数据结构进行编码和解码。谁能帮助我做得更好,更简单? 或者是否有任何内置函数可以使用字典数据结构执行编码和解码?

 qwerty_encrypt={'a':'q','b':'w','c':'e','d':'r','e':'t','f':'y','g':'u','h':'i','i':'o','j':'p','k':'a','l':'s','m':'d','n':'f','o':'g','p':'h','q':'j','r':'k','s':'l','t':'z','u':'x','v':'c','w':'v','x':'b','y':'n','z':'m','1':'9','2':'8','3':'7','4':'6','5':'5','6':'4','7':'3','8':'2','9':'1','0':'0'}
    msg=input('enter yuor msg:').lower()
    #encrypt_func
    def enigma_encrypt(msg):
        a=list(msg.split(' '))
        li=[]
        for i in a:
            li.append(list(i))
        li2=[]
        li4=[]
        for i,j in enumerate(li):
            li3=[]
            for k,l in enumerate(j):
                li3.append(qwerty_encrypt[l])
            li2.append(li3)
        for m in li2:
            li4.append(''.join(m))
        after_encrypt=(' '.join(li4))
        return after_encrypt
    def enigma_decrypt(msg):
        a=list(msg.split(' '))
        li=[]
        for i in a:
            li.append(list(i))
        li2=[]
        li4=[]
        for i,j in enumerate(li):
            li3=[]
            for k,l in enumerate(j):
                for n in qwerty_encrypt:
                    if qwerty_encrypt[n]==l:
                        li3.append(n)
            li2.append(li3)
        for m in li2:
            li4.append(''.join(m))
        after_encrypt=(' '.join(li4))
        return after_encrypt
    print('After encrytion:',enigma_encrypt(msg),'\nAfter decryption:',enigma_decrypt(enigma_encrypt(msg)))

【问题讨论】:

  • 为什么要使用这么多列表? msg 将是一个可迭代的字符串。我也会做一个解密字典。然后几乎有两个循环输出您的解密消息和加密消息。 {" ":" "} 也是一个有效的字典

标签: python list dictionary-comprehension


【解决方案1】:

您可以将str.translatestr.maketrans 结合使用:

qwerty_encrypt = {'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y',
                  'g': 'u', 'h': 'i', 'i': 'o', 'j': 'p', 'k': 'a', 'l': 's',
                  'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
                  's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b',
                  'y': 'n', 'z': 'm', '1': '9', '2': '8', '3': '7', '4': '6',
                  '5': '5', '6': '4', '7': '3', '8': '2', '9': '1', '0': '0'}

qwerty_decrypt = {value: key for key, value in qwerty_encrypt.items()}
assert len(qwerty_decrypt) == len(qwerty_encrypt)

table_encrypt = str.maketrans(qwerty_encrypt)
table_decrypt = str.maketrans(qwerty_decrypt)

msg = 'Hello Stack Overflow'.lower()

print('After encryption:', msg.translate(table_encrypt))
print('After decryption:',
      msg.translate(table_encrypt).translate(table_decrypt))

【讨论】:

    【解决方案2】:

    尽管@myrmica 代码简单易懂,

    但这是我尝试使用较少列表的相同方式。我希望这是你所期望的。

    qwerty_encrypt={'a':'q','b':'w','c':'e','d':'r','e':'t','f':'y','g':'u','h':'i','i':'o','j':'p','k':'a','l':'s','m':'d','n':'f','o':'g','p':'h','q':'j','r':'k','s':'l','t':'z','u':'x','v':'c','w':'v','x':'b','y':'n','z':'m','1':'9','2':'8','3':'7','4':'6','5':'5','6':'4','7':'3','8':'2','9':'1','0':'0'}
    msg=input('enter yuor msg:').lower()
    print (msg)
    def enigma_encrypt(msg):
        enc=[]
        for i in msg:
            if i!=' ':
                enc.append(qwerty_encrypt[i])
            elif i==' ':
                enc.append(" ")
        return "".join(enc)
    
    def enigma_decrypt(msg):
        ms=enigma_encrypt(msg)
        dec=[]
        for j in ms:
            for u,v in qwerty_encrypt.items():
                if j!=' ' and v==j:
                    dec.append(u)
                elif j==' ':
                    dec.append(" ")
                    break
        return "".join(dec)
    
    print('After encrytion:',enigma_encrypt(msg)+"\n"+'After decrytion:',enigma_decrypt(msg))
    
    Output:
    
    After encryption: itssg lzqea gctkysgv
    After decryption: hello stack overflow
    
    

    【讨论】:

      【解决方案3】:

      我更改了 qwerty_encrypt 以添加 null 作为空格。 事情是这样的:

      qwerty_encrypt={'a':'q','b':'w','c':'e','d':'r','e':'t','f':'y','g':'u','h':'i','i':'o','j':'p','k':'a','l':'s','m':'d','n':'f','o':'g','p':'h','q':'j','r':'k','s':'l','t':'z','u':'x','v':'c','w':'v','x':'b','y':'n','z':'m','1':'9','2':'8','3':'7','4':'6','5':'5','6':'4','7':'3','8':'2','9':'1',' ':' '}
      
      #encoding
      def enigma_encrypt(msg):
      
          encode = []
          msg = msg.lower()
      
          for words in msg:
              chars = [char for char in words]
              for k,v in qwerty_encrypt.items():
                  if chars[0] == k:#extract char from single list
                      encode.append(v)    
      
          return ''.join(encode)  
      
      #decoding 
      def enigma_decrypt(encrypted):
      
          decode = []
      
          for code in encrypted:
              chars = [char for char in code]
              for k,v in qwerty_encrypt.items():
                  if chars[0] == v: #extract char from single list
                      decode.append(k)
      
          return ''.join(decode)
      

      会发生这样的事情:

      encrypt = enigma_encrypt('Welcome Shenbga')
      print(encrypt)
      vtsegdt litfwuq
      
      dencrypt = enigma_decrypt('vtsegdt litfwuq')
      print(dencrypt)
      welcome shenbga
      

      【讨论】:

      • 它不处理句子中的空格。 @powerPixie
      • @SivaShanmugam 我再次检查。有必要使用我编辑的 qwerty_encrypt,最后添加了两个空格。您可以看到打印的代码正在运行。
      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多