IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【Python 每日一技】使用字典进行计算 -> 正文阅读

[数据结构与算法]【Python 每日一技】使用字典进行计算

1 问题

你希望针对字典中的数据执行各种计算操作(例如:最大值、最小值、排序等等)。

2. 解决方案

假定现有下列字典,字典的每一项建立了股票名和股价的映射:

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

为了可以方便地对字典数据进行计算,通过需要使用 zip 类将字典中的键和值进行翻转。例如,下面基于此结合 min()max() 函数查找到了最低和最高股价及对应股票名称:

>>> min_price = min(zip(prices.values(), prices.keys()))
>>> min_price
(10.75, 'FB')

>>> max_price = max(zip(prices.values(), prices.keys()))
>>> max_price
(612.78, 'AAPL')

类似地,也可以结合 zip 类和 sorted 函数对数据进行排序,例如:

>>> prices_sorted = sorted(zip(prices.values(), prices.keys()))
>>> prices_sorted
[(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))
(10.75, 'FB')
>>> print(max(prices_and_names))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: max() arg is an empty sequence

3. 讨论

需要特别注意的是,如果你直接针对字典对象进行上述类似计算,那么你会发现执行的结果是针对字典所有的键而不是值。例如:

>>> max(prices)
'IBM'
>>> min(prices)
'AAPL'

为了避免上述情况,你可以通过调用字典对象的 values() 方法来解决:

>>> min(prices.values())
10.75
>>> max(prices.values())
612.78

然而,这可能也不是你最终需要的,你最终需要的可能是股价最低或最高的股票的名称。对此,你可以通过为 min()max() 函数的形参 key 指定一个函数作为实参来得到股价最小值或最大值对应的股票名称(即字典中每一条记录的键)。例如:

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

如果你希望得到股价的最小值或最大值,你可以继续这么做:

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

因此,为了避免上述这么复杂的逻辑,本文一开始就使用了 zip 来将字典中的键值对转化为 (value, key) 元组形式的序列对。当对元组进行比较时,元组的 value 会被先行比较,然后是比较 value ,这样一来就可以直接使用 min()max() 以及 sorted() 函数了,也不用指定参数 key 了。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:25:52  更:2022-03-17 22:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:52:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码