原连接:https://blog.csdn.net/ywx1832990/article/details/79145576
众所周知,字典dict
最大的好处就是查找或插入的速度极快,并且不想列表list
一样,随着key的增加越来越复杂。但是dict
需要占用较大的内存空间,换句话说,字典dict
是以空间换速度。详细请见如下示例:
student = {'小萌': '1001', '小智': '1002', '小强': '1003', '小明': '1004'}
由key
查value
很简单,直接调用:dict ['key']
,如下:
student ['小强']
结果显示:'1003'
但如果此时,我们想由value
查找key
,则会相对复杂一点,一般来说可通过如下3种方式实现:
###A. 充分利用 keys()
、values()
、index()
函数
list (student.keys()) [list (student.values()).index ('1004')]
结果显示: '小明'
###B. 通过定义get_key
函数的方式
def get_key (dict, value):
return [k for k, v in dict.items() if v == value]
get_key (student, '1002')
结果显示:'小智'
###C. 将原字典dict
进行反转得新字典new_dict
,由原来的K-V
存储形式,变为V-K
存储形式
new_dict = {v : k for k, v in dict.items()}
new_dict ['1001']
结果显示:'小萌'
虽然我们可以通过以上方式获得由value
查找key
的目的,但是我们必须明确一点:在字典dict
中,key
值是唯一的,且不可变;而value
可以随意取值,且不唯一。之所以强调这一点,是因为在利用上述方法时,会出现失效的情况。如下所示:
假设此时原字典student
发生了一些变化,变为:
student = {'小萌': '1001', '小智': '1002', '小强': '1003', '小明': ['1004', '1005']}
那么再次调用上述3种方法,由value
查key
时,则出现:
list (student.keys()) [list (student.values()).index ('1004')]
结果显示:ValueError: '1004' is not in list
因为value
不唯一,key—'小明'
对应了两个value
,且他们以list
形式存储着,所以如果只取其中一个value
值是无法查找对应的key
值,必须将多个value
值组成的list
视为一个整体,即:
list (student.keys()) [list (student.values()).index (['1004', '1005'])]
结果显示:'小明'
def get_key (dict, value):
return [k for k, v in dict.items() if v == value]
get_key (student, '1004')
结果显示:[ ]
get_key (student, ['1004', '1005'])
结果显示:'小明'
new_dict = {v : k for k, v in dict.items()}
回车后系统报错:TypeError: unhashable type: 'list'
由于key
不可变且唯一,当K-V
反转以后,key—'小明'
对应了两个value
组成的list
,反过来就变成了key
,即此时由list
充当key,因为list
是可变动的,所以这在Python
中是不允许的。
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:Python基础--字典中由value查询key的几点说明