字典运算

问题

怎样在数据字典中执行一些计算操作 (比如求最小值、最大值、排序等等)?

解法

考虑下面的股票名和价格映射字典:

prices = {'ACME': 45.23,'AAPL': 612.78,'IBM': 205.55,'HPQ': 37.20,'FB': 10.75
}

为了对字典值执行计算操作,通常需要使用 zip() 函数先将键和值反转过来。比如,下面是查找最小和最大股票价格和股票值的代码:

min_price = min(zip(prices.values(), prices.keys()))
# min_price is (10.75, 'FB')max_price = max(zip(prices.values(), prices.keys()))
# max_price is (612.78, 'AAPL')

类似的,可以使用 zip() 和 sorted() 函数来排列字典数据:

prices_sorted = sorted(zip(prices.values(), prices.keys()))
# prices_sorted is [(10.75, 'FB'), (37.2, 'HPQ'),
#   (45.23, 'ACME'), (205.55, 'IBM'),
#   (612.78, 'AAPL')]

执行这些计算的时候,需要注意的是 zip() 函数创建的是一个只能访问一次的迭
代器。比如,下面的代码就会产生错误:

prices_and_names = zip(prices.values(), prices.keys())
print(min(prices_and_names)) # OK
print(max(prices_and_names)) # ValueError: max() arg is an empty sequence

讨论

如果你在一个字典上执行普通的数学运算,你会发现它们仅仅作用于键,而不是值。比如:

min(prices) # Returns 'AAPL'
max(prices) # Returns 'IBM'

这个结果并不是你想要的,因为你想要在字典的值集合上执行这些计算。或许你会尝试着使用字典的values()方法来解决这个问题:

min(prices.values()) # Returns 10.75
max(prices.values()) # Returns 612.78

不幸的是,通常这个结果同样也不是你想要的。你可能还想要知道对应的键的信息
(比如那种股票价格是最低的? )。

幸运的是,min()和max()函数中提供 key 函数参数来获取最小值或最大值对应的
键的信息。比如:

min(prices, key=lambda k: prices[k]) # Returns 'FB'
max(prices, key=lambda k: prices[k]) # Returns 'AAPL'

但是,如果还想要得到最小值,你又得执行一次查找操作。比如:

min_value = prices[min(prices, key=lambda k: prices[k])]

前面的zip()函数方案通过将字典“反转” 为 (值,键) 元组序列来解决了上述问题。当比较两个元组的时候,值会先进行比较,然后才是键。这样的话你就能通过一条简单的语句就能很轻松的实现在字典上的求最值和排序操作了。

需要注意的是在计算操作中使用到了 (值,键) 对。当多个实体拥有相同的值的时
候,键会决定返回结果。比如,在执行 min() 和 max() 操作的时候,如果恰巧最小或
最大值有重复的,那么拥有最小或最大键的实体会返回:

>>> prices = { 'AAA' : 45.23, 'ZZZ': 45.23 }
>>> min(zip(prices.values(), prices.keys()))
(45.23, 'AAA')
>>> max(zip(prices.values(), prices.keys()))
(45.23, 'ZZZ')
>>>

《Python Cookbook 3rd》笔记(1.8):字典运算相关推荐

  1. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  2. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  3. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  7. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  8. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  9. 《Python Cookbook 3rd》笔记(3.9):大型数组运算

    大型数组运算 问题 你需要在大数据集 (比如数组或网格) 上面执行计算. 解法 涉及到数组的重量级运算操作,可以使用 NumPy 库. NumPy 的一个主要特征是它会给 Python 提供一个数组对 ...

最新文章

  1. 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
  2. Arm官宣V9架构,用AI和安全对抗英特尔,最快今年年底用上
  3. 用神经网络解释化学键能 化学键的键能:一个方程组的特征解
  4. 搭建 Verilog 仿真环境
  5. python脚本批量生成数据
  6. 在hadoop/hbase等代码中kinit
  7. echarts 地图实现轮播(一)
  8. Android TimeAnimator
  9. 登录界面点击登录后如何延迟提示成功的div的显示时间并跳转
  10. 华为荣耀鸿蒙系统升级名单,华为鸿蒙系统正式版首批升级名单公布:这8款机型用户有福了...
  11. BZOJ5336 DP套DP
  12. 常见机器视觉软件OpenCV/Halcon/VisionPro/MIL的区别
  13. 更改文字颜色为红色HTMl语言,红色字体CSS_设置html字体颜色为红色
  14. 阿里云短信申请流程以及配置
  15. ANativeWindow
  16. form表单及其连用标签总结
  17. 能ping通,http请求不通
  18. vscode中git push代码时报错PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364
  19. 林语堂:我生之初尚无为
  20. 线性代数知识总结梳理

热门文章

  1. WINCE 网卡控制
  2. 设置最大值_变频器用远传压力表控制恒压供水参数设置
  3. python如何进行格式化输出变量_Python变量格式化输出实现原理解析
  4. arcgis字段计算器利用python按两列要求编号
  5. 【转】C,C++宏中#与##的讲解
  6. 【转】ubuntu 开机sudo启动应用程序
  7. C#的变迁史06 - C# 4.0 之并行处理篇
  8. 第十节:进一步扩展两种安全校验方式
  9. PWN-PRACTICE-BUUCTF-14
  10. REVERSE-PRACTICE-CthulhuOJ