《Python Cookbook 3rd》笔记(1.8):字典运算
字典运算
问题
怎样在数据字典中执行一些计算操作 (比如求最小值、最大值、排序等等)?
解法
考虑下面的股票名和价格映射字典:
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):字典运算相关推荐
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python cookbook》笔记一
<Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...
- 《Python Cookbook 3rd》笔记(3.9):大型数组运算
大型数组运算 问题 你需要在大数据集 (比如数组或网格) 上面执行计算. 解法 涉及到数组的重量级运算操作,可以使用 NumPy 库. NumPy 的一个主要特征是它会给 Python 提供一个数组对 ...
最新文章
- 令人拍案叫绝的Wasserstein GAN
- python3.7如何使用enum_我如何用Python表示‘Enum’?
- git cmd 命令在已有的仓库重新添加新的文件夹
- Linux_SquidProxyServer代理服务器
- python的print格式化输出的format()方法和%两种方法
- 【Excel】日常记录
- IntelliJ IDEA 安装问题解决
- NWERC 2018 C. Circuit Board Design 树 + 构造
- SpringCloud教程 | 第四篇:断路器(Hystrix)
- MATLAB 撰写word
- python时间序列模型有哪些_时间序列模型(ARIMA)
- MySQL · BUG分析 · Rename table 死锁分析
- catgroup linux_Linux用户(user)和用户组(group)的日常管理与操作教程概述
- 190316每日一句
- 3种不同脸型的瘦脸方法
- Matlab调用动态链接库DLL文件
- 知物由学 | 如何从勒索软件的攻击中全身而退
- java.lang.NullPointerException: null的错误
- 什么是PON(无源光纤网络)、PON的发展及演进
- Matlab 求矩阵的中值
热门文章
- php对象存储hadoop存储,三个理由告诉你对象存储替换HDFS还不错
- excel怎么添加diy工具箱_这些Excel插件让你的Excel更好用!
- Office Web Apps安装部署(二)
- MQTT和HTTP的区别
- JAVA 捕获异常所遇BUG
- 采购模板html5,蓝色的采购信息管理系统手机界面wap模板
- 【CodeForces - 920E】Connected Components? (dsu,补图连通块,STLset+map,bfs 或bitset)
- 【CodeForces - 294B】Shaass and Bookshelf(枚举,贪心,思维,组内贪心组间dp)
- 【ZOJ - 3211】Dream City (01背包类问题,贪心背包)
- 【UVALive - 3126】Taxi Cab Scheme (二分图,最小路径覆盖)