需要缩短获取功能

时间:2017-03-18 03:24:24

标签: python

我试图理解这段代码中的最后一行 - 我知道它正在encdic中获取等效的明文字符(encyption字典并将它们连接在一起以创建加密消息。什么是{{1代码做(取上面的字符并将其转换为较低的字符?如果所有字符都已经小写 - 我如何缩短最后一行

l.lower

当我将代码缩短为:

return s.join(encdic.get(c.lower(), c) for c in plaintext)
plaintext = "hhis is a fairly long piece of plainhexh fourscore and seven" 
d = 'gikaclmnqrpoxzybdefijstuvw' #decryption key
encdic = dict(zip(alphabet, d)) #create decryption dictionary
decdic = dict(zip(d, alphabet)) #create decryption dictionary

def encrypt(plaintext, d):
    s=""
    return s.join(encdic.get(c.lower(), c) for c in plaintext)

我收到以下错误

return s.join(encdic.get(c) for c in plaintext)

我该如何解决这个问题?

更新

我已将代码更改为:

TypeError: sequence item 4: expected str instance, NoneType found

似乎无误地工作,但为什么?

3 个答案:

答案 0 :(得分:2)

您的密钥有i两次且缺少h

数据:

d = 'gikaclmnqrpoxzybdefijstuvw'  # decryption key

测试代码:

print(sorted(list(set(d))))
print(sorted(list(d)))

<强>结果:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

答案 1 :(得分:0)

get()方法定义如下:

dict.get(key, default=None)

由于给定的密钥c返回None,这意味着密钥c不可用。

你提到这个有效:return s.join(encdic.get(c,c) for c in plaintext) 这样做的原因是因为当&#39; c&#39;找不到键,返回默认值c。假设字母为'abcdefghijklmnopqrstuvwxyz',唯一不能找到c的是它是否为空白。因此,您的空白字符不会被加密。

以前在执行return s.join(encdic.get(c) for c in plaintext)时,当c是空格时,这不是有效键,因为您的键只包含字母a-z。

这是一个有效的例子:

alphabet = 'abcdefghijklmnopqrstuvwxyz'
plaintext = "hhis is a fairly long piece of plainhexh fourscore and seven" 
d = 'gikaclmnqrpoxzybdefijstuvw' #decryption key
encdic = dict(zip(alphabet, d)) #create decryption dictionary
decdic = dict(zip(d, alphabet)) #create decryption dictionary

def encrypt(plaintext):
    return "".join(encdic.get(c, c) for c in plaintext)
def decrypt(encrypted_text):
    return "".join(decdic.get(c, c) for c in encrypted_text)

encrypted_text = encrypt(plaintext)
decrypted_text = decrypt(encrypted_text)
print("plaintext:", plaintext + '\n'
  "encrypted_text:", encrypted_text + '\n'
  "decrypted_text:", decrypted_text + '\n')

答案 2 :(得分:0)

这是一个适合我的解决方案。

alphabet

我能够使用此代码获取加密字符串和解密字符串。错误可能出现在h的定义中,或者您可能正在传递一个字符串以解密其中包含字母d的字符串,因为{{1}}中缺少该字符串,因此您可以“{1}} t解密和加密字符串,如果它包含字符&#39; h&#39;。