《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')
>>>
相关文章
|
18天前
|
Python
python幂运算——计算x的y次方
python幂运算——计算x的y次方
24 0
|
1天前
|
Python
【Python操作基础】——字典,迭代器和生成器
【Python操作基础】——字典,迭代器和生成器
|
2天前
|
索引 Python
Python中的列表、元组和字典各具特色
Python中的列表、元组和字典各具特色:列表是可变的,元组不可变,字典亦可变;列表和元组有序,字典无序(但在Python 3.7+保持插入顺序);元素类型上,列表和元组元素任意,字典需键不可变;列表用方括号[],元组用圆括号(),字典用大括号{}表示。列表不适合作字典键,元组可以。选择数据结构应依据实际需求。
7 2
|
4天前
|
开发者 Python
【Python 基础】递推式构造字典(dictionary comprehension)
【5月更文挑战第8天】【Python 基础】递推式构造字典(dictionary comprehension)
|
7天前
|
安全 数据安全/隐私保护 Python
Python的整型在计算中具有以下优势
Python整型提供任意精度整数计算,无溢出风险;支持多种算术运算,操作简便;作为不可变类型保证数据安全;能进行高级数学运算,并有NumPy等库加持,适合数值分析和科学计算。
16 0
|
7天前
|
Python
Python的整型在计算中的精度可以通过使用二进制或十进制表示来体现
Python整型支持十、二、八、十六进制表示,其中十进制默认,二进制(0b前缀)、八进制(0o前缀)、十六进制(0x前缀)。计算时以二进制精度处理,确保结果准确。例如:123的二进制是0b1111011,八进制是0o173,十六进制是0x7b。
11 0
|
14天前
|
Python
Python中字典和集合(二)
Python中字典和集合(二)
|
14天前
|
存储 算法 索引
Python中字典和集合(一)
Python中字典和集合(一)
|
15天前
|
存储 缓存 Python
【Python21天学习挑战赛】字典 && 小数据池
【Python21天学习挑战赛】字典 && 小数据池
|
16天前
|
存储 JSON 数据处理