Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要缩短get函数_Python - Fatal编程技术网

Python 需要缩短get函数

Python 需要缩短get函数,python,Python,我试图理解这段代码的最后一行-我知道它在encdic(EncOption dictionary)中获得了等效的明文字符,并将其全部连接起来以创建加密消息。l.lower代码在做什么(使用大写字符并将其转换为小写?如果所有字符都是小写-如何缩短最后一行 return s.join(encdic.get(c.lower(), c) for c in plaintext) plaintext = "hhis is a fairly long piece of plainhexh fourscore a

我试图理解这段代码的最后一行-我知道它在
encdic
(EncOption dictionary)中获得了等效的明文字符,并将其全部连接起来以创建加密消息。
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)
return s.join(encdic.get(c,c) for c in plaintext) 
我得到以下错误

TypeError: sequence item 4: expected str instance, NoneType found
我怎样才能解决这个问题

更新:

我已将代码更改为:

return s.join(encdic.get(c) for c in plaintext)
return s.join(encdic.get(c,c) for c in plaintext) 
似乎可以正常工作,但为什么?

get()方法定义如下:

dict.get(key, default=None)
由于给定的键c返回None,这意味着键c不可用

您提到了这一点:
返回s.join(encdic.get(c,c)表示纯文本中的c)
这是因为当找不到“c”作为密钥时,会返回默认值c。假设字母表是
'abcdefghijklmnopqrstuvwxyz'
唯一找不到c的时间是如果它是空白字符。因此,此空白字符不会被加密

以前在执行
时返回s.join(encdic.get(c)表示c为明文)
,当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')

您的键有两次
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']
测试代码:

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']
结果:

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

这里有一个适合我的解决方案

alphabet = 'abcdefghijklmnopqrstuvwxyz ' #space added to end
d = 'gikaclmnqrpoxzybdefijstuvw '        #space added to end

encdic = dict(zip(alphabet,d))
decdic = dict(zip(d,alphabet))

def encrypt(plaintext): #note, I removed d since it isn't used
    s=""
    return s.join(encdic.get(c) for c in plaintext)

def decrypt(encrypted): #note, I removed d since it isn't used
    s=""
    return s.join(encdic.get(c) for c in encrypted)

我可以使用此代码获取加密字符串和解密字符串。错误可能在
字母表的定义中,或者您可能传递了一个包含字母
h
的字符串进行解密,因为
d
中缺少该字母,所以如果该字符串包含字符“h”,则无法解密和加密字符串

1)您确定
c
总是小写吗?2)你确定
c
始终是
encdic
中的一个键吗?如果不是,你必须使用更长的形式,确保键是小写的,如果在字典中找不到键,则返回一个默认值。谢谢-它是在明文中迭代查找每个字符并创建一个加密消息-所有的明文都是较低的case for sue-为什么我调整后的代码可以工作(因为字典是压缩的?ie看起来像'a:g','s:f':等等,需要第二个参数?类型错误意味着其中一个字典查找失败并且
.get()
返回值
None
。您确定“明文”中没有空格之类的非字母字符吗?是的,明文中有空格-我尝试向字母字符串和解密密钥添加空格-仍然出现错误,感谢您的持续帮助如果添加
打印(repr(明文))会得到什么输出
encrypt()
函数?谢谢大家-通过暴力找到了它(即查看-有两个“i”和“no”h。很高兴我找到了htis站点-非常感谢我得到的所有帮助-在这方面浪费了两个多时间-很抱歉,我是一个新手