字典中由value查key的几点说明

众所周知,字典dict最大的好处就是查找或插入的速度极快,并且不想列表list一样,随着key的增加越来越复杂。但是dict需要占用较大的内存空间,换句话说,字典dict是以空间换速度。详细请见如下示例:


student = {'小萌': '1001', '小智': '1002', '小强': '1003', '小明': '1004'}


# 由key查value很简单,直接调用:dict ['key'],如下:


>>> student ['小强']

# 结果显示:'1003'

但如果此时,我们想由value查找key,则会相对复杂一点,一般来说可通过如下3种方式实现:

充分利用 keys() 、values()、index() 函数

>>> list (student.keys()) [list (student.values()).index ('1004')]

结果显示: '小明'

通过定义get_key函数的方式

>>> def get_key (dict, value):

               return [k for k, v in dict.items() if v == value]

>>> get_key (student, '1002')

# 结果显示:'小智'

将原字典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中是不允许的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值