《Python Cookbook(第3版)中文版》——1.8 与字典有关的计算问题

简介:

本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第1章,第1.8节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.8 与字典有关的计算问题

1.8.1 问题

我们想在字典上对数据执行各式各样的计算(比如求最小值、最大值、排序等)。

1.8.2 解决方案

假设有一个字典在股票名称和对应的价格间做了映射:

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

1.8.3 讨论

如果尝试在字典上执行常见的数据操作,将会发现它们只会处理键,而不是值。例如:

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

这很可能不是我们所期望的,因为实际上我们是尝试对字典的值做计算。可以利用字典的values()方法来解决这个问题:

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

不幸的是,通常这也不是我们所期望的。比如,我们可能想知道相应的键所关联的信息是什么(例如哪支股票的价格最低?)

如果提供一个key参数传递给min()和max(),就能得到最大值和最小值所对应的键是什么。例如:

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()的解决方案是通过将字典的键-值对“反转”为值-键对序列来解决这个问题的。

当在这样的元组上执行比较操作时,值会先进行比较,然后才是键。这完全符合我们的期望,允许我们用一条单独的语句轻松的对字典里的内容做整理和排序。

应该要注意的是,当涉及(value, key)对的比较时,如果碰巧有多个条目拥有相同的value值,那么此时key将用来作为判定结果的依据。例如,在计算min()和max()时,如果碰巧value的值相同,则将返回拥有最小或最大key值的那个条目。示例如下:

>>> 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')
>>>
相关文章
|
17天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
1月前
|
算法 索引 Python
使用Python实现PageRank计算
使用Python实现PageRank计算
|
8天前
|
安全 Python
python字典的内置方法
Python字典主要方法包括:`keys()`(返回所有键)、`values()`(返回所有值)、`items()`(返回所有键值对)、`get()`(安全取值,键不存在时返回默认值)、`setdefault()`(设置默认值)、`update()`(合并字典)、`pop()`(删除并返回值)、`clear()`(清空字典)、`copy()`(浅拷贝)、`fromkeys()`(新建字典并设置默认值)、`popitem()`(随机删除键值对)。
8 0
|
11天前
|
算法 Python
78: 计算生日是星期几(python)
78: 计算生日是星期几(python)
|
16天前
|
存储 Java 程序员
【Python】6. 基础语法(4) -- 列表+元组+字典篇
【Python】6. 基础语法(4) -- 列表+元组+字典篇
39 1
|
16天前
|
存储 Python
python基础篇: 详解 Python 字典类型内置方法
python基础篇: 详解 Python 字典类型内置方法
25 1
|
22天前
|
C语言 Python
Python字典推导式:高效构建字典的利器
在Python编程中,字典推导式(Dictionary Comprehension)是一种强大的构造工具,它允许我们以简洁的方式从现有可迭代对象创建新的字典。通过字典推导式,我们可以轻松地对数据进行转换、过滤或重新组织,以符合特定的需求。本文将深入探讨字典推导式的概念、语法和应用场景,帮助读者更好地掌握这一高效的编程工具。
|
27天前
|
Python
深入解析Python中的字典推导式
深入解析Python中的字典推导式
|
29天前
|
Python
Python函数之计算规则图形的面积
Python函数之计算规则图形的面积
15 0
|
1月前
|
存储 Java Python
助你更好的理解 Python 字典
助你更好的理解 Python 字典

热门文章

最新文章