Python 3.x 如何使用Python3字典中的值查找键?

Python 3.x 如何使用Python3字典中的值查找键?,python-3.x,dictionary,memory-address,Python 3.x,Dictionary,Memory Address,我正在写一个密码,我已经给字母表中的每个字母分配了数值,字母表{u dictionary={'a':0,'b':1,'c':2 我首先将消息中的字母转换为数字,进行一些算术运算,并将这些数字存储在名为code的变量中 我想把它们转换回字母 到目前为止,我已经: for number in code: for letter, value in alphabet_dictionary.items(): if value == number: coded

我正在写一个密码,我已经给字母表中的每个字母分配了数值,
字母表{u dictionary={'a':0,'b':1,'c':2

我首先将
消息中的字母
转换为数字,进行一些算术运算,并将这些数字存储在名为
code
的变量中

我想把它们转换回字母

到目前为止,我已经:

for number in code:
    for letter, value in alphabet_dictionary.items():
        if value == number:
            coded_message.append(letter)
这很有效。我在
coded_message
列表中找到了正确的编码信息。有更好或更有效的方法吗

为什么我不能在一行中完成?我首先尝试使用:

for number in code:
    coded_message.append(letter for letter, value in alphabet_dictionary.items() if value == number)
但这仅附加单个字符的内存分配地址,例如:

`[<generator object <genexpr> at 0x1011bb240>, <generator object <genexpr> at 0x1011bb1f8>, <generator object <genexpr> at 0x1011bb288>, <generator object <genexpr> at 0x1011bb2d0>, <generator object <genexpr> at 0x1011bb318>, <generator object <genexpr> at 0x1011bb360>, <generator object <genexpr> at 0x1011bb3a8>]'
`[,,]'

为什么会发生这种情况?

您没有得到
字母的内存位置,而是得到了它认为是您(无意中)创建的生成器的内存位置
.append()
接受一个参数,当您给它一个生成器expr时,它会愉快地将其作为参数,并将其添加。您可以像@Tadhg McDonald Jensen提到的那样,将gen expr包装在
next
中,也可以尝试将
.append()
更改为
.extend()

要详细说明一下:

x = letter for letter, value in alphabet_dictionary.items() if value == number
type(x)  ## generator-expression
for i in x: 
    print(i)
## will only print the single value that satisfied this generator
类似地,如果您在
.append()
中将其作为一个明确的列表理解,它可能更容易显示问题:

for number in code:
    coded_message.append([letter for letter, value in alphabet_dictionary.items() if value == number])

coded_message
## [["a"], ["b"],... ] - not the right order, of course, but now you have a list of lists, which is probably not what you want.
如果您使用
next
extend
,您将得到一个字母列表,这可能就是您想要的

不过,如果您想要反向映射,我也会将反向映射构建为字典。当您第一次创建映射时,例如,“a”=0,还可以使用0=“a”创建一个字典。这将加快查找速度(尽管使用字母表大小的列表,您可能永远不会注意到),并允许您进行健全性检查,例如

for letter, number in alphabet_dict.items():
    if number_dict[number] != letter:
        raise "Something got confused: got {}->{}->{}".format(letter, number, number_dict[number])
您可以使用
map

code = 'somestring'
coded_message = map(alphabet_dictionary.__getitem__, code)
解码:

#invert the dictionary, in your case it's easy because it's 1-to-1:
decode_dictionary = {v:k for k,v in alphabet_dictionary.items()}
decoded_message = map(decode_dictionary.__getitem__, coded_message)

如果您完全确定与您可以使用的
coded\u消息的值正好有一个匹配项,则可能重复。追加(下一个(字母对字母,字母表中的值)。items()如果值==number))
以获取下一个(第一个)生成器表达式的值,但作为状态的公认答案:没有继承保证值存在于字典中。因为您只是将字母链接到数字,所以可以使用
string.ascii\u lowercase[index]
按索引和
string.ascii\u lowercase.index(char)查找字母
获取字符的索引。
#invert the dictionary, in your case it's easy because it's 1-to-1:
decode_dictionary = {v:k for k,v in alphabet_dictionary.items()}
decoded_message = map(decode_dictionary.__getitem__, coded_message)