【Python 秘籍】与字典的值有关的计算问题

艺赛旗 RPA9.0全新首发免费下载 点击下载
http://www.i-search.com.cn/index.html?from=line1
问题
我们想在字典上对数据执行各式各样的计算(比如求最小值、最大值、排序等)
解决方案
假设有一个字典在股票名称和相应的价格间做了映射:
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

不幸的是,通常这也不是我们所期望的。比如,我们可能想知道相应的键所关联的信息是什么(例如哪支股票的价格最低?)
如果提供一个 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 将用来作为判定结果的依据。例如,在计算 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’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值