众所周知,字典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中是不允许的。

Python基础——字典中由value查key的几点说明相关推荐

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

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

  2. python基础-字典的增删改查

    字典 字典的创建方式: # 方式一: dict1 = dict((("one", 1), ("two", 2), ("three", 3)) ...

  3. python输出字典的key_python3 打印输出字典中特定的某个key的方法示例

    本文实例讲述了python3 打印输出字典中特定的某个key的方法.分享给大家供大家参考,具体如下: 大家都知道python中的字典里的元素是无序的,不能通过索引去找到它,今天说我下通过下面几个方法去 ...

  4. 大学python教材实验七字典与集合答案_2018-08-28 day7 python基础 字典和集合(含作业)...

    1.字典(dict) 一.字典是容器类型(序列 ),以键值对作为元素.字典里面存的数据全是以键值对的形式出现的 b/键值对----> 键:值(key:value) dict1 = {'key1' ...

  5. python基础—字典

    阅读文本需要3分钟,不建议跳读 节目清单 字典是python中最重要的数据类型,字典由"键-值"对组成的集合,字典中的"值"通过"键"来引用 ...

  6. 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

    5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...

  7. python 获取 字典中的指定键_python中字典方法的详细教程

    上篇文章讲到了python字典的基础知识,今天继续python中哈希(字典的应用)方法的应用. 前章回顾: python字典的应用及案例分析 字典方法: dict.clear() 删出字典内所有的元素 ...

  8. python字典和集合对象可以进行索引操作_建议收藏丨纯知识点:Python基础—字典、集合操作大全...

    本文为纯知识点,预计需阅读二十分钟 数据结构基本上就是--它们是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的. 在Python中有四种内建的数据结构--列表.元组和字典,集合. ...

  9. python基础-字典

    python中操作字典,字典可变 访问,取值 dict1 = {'Name':'xm','Age':18,'Class':'First'}print("dict1['Name']:" ...

最新文章

  1. ros web_video_server的使用及Python获取实时画面
  2. PHP正则表达式入门教程[转]
  3. jsp oracle 登录页面,Oracle数据库之ORACLE+Myeclipse+jsp实现简单登录功能
  4. win8无权限访问这台计算机,win8共享打印机无访问权限的解决方法
  5. Socket网络通讯开发总结之:Java 与 C进行Socket通讯
  6. 求平方根sqrt()函数的底层算法效率问题
  7. CCIE-LAB-第十篇-BGP-VPNV4+VNPN6+MPLS+关闭TTL
  8. 《大数据》第1期“研究”——大数据管理系统评测基准的挑战与研究进展(下)...
  9. java+串行和并行的区别_Java8新特性_并行流与串行流
  10. Redis2-简单动态字符串
  11. iOS视频播放器开发
  12. Android 13运行时权限变更一览
  13. LeetCode——777.在LRX字符串中交换相邻字符
  14. 修复 Key is stored in legacy trusted.gpg keyring
  15. 安徽省美术作品版权登记技巧,申请了商标还要申请美术作品版权吗?
  16. java.lang.SecurityException: User has not given permission to device UsbDevice
  17. Autocad毕业设计CAD机械练习图开始发放啦!
  18. C语言与Java的异同
  19. comsol圆柱形永磁体_基于COMSOL Multiphysics的磁场仿真分析
  20. 如何初版一本书——出版社选择

热门文章

  1. python 3des加密_使用Python进行3DES加密-pyDes
  2. fineui 选择器F.ui[ ]性能优化
  3. Leetcode P620 DFS解法,思路简单易懂
  4. 2021WSB-day3-3:Yasushi教授介绍步态识别的最新研究进展
  5. 如何选择游戏配音与音乐?
  6. mac小技巧:如何使用mac自带的照片库?
  7. 视频流媒体服务器可以将一路摄像头的视频流分发多路吗?
  8. 简述彭罗斯近年一些公开讲堂内容的物理意义
  9. 为kindeditor添加在线播放视频功能(基于原有flash上传,mp4,flv,flash)
  10. 解决Ubuntu14.04下Chromium安装Flash播放器