字典相关的计算场景
字典对象(dict)是典型的键值映射对象,key: value。有时,我们会遇到这样的场景:提取字典对象中value最大或最小的键值对,或根据value的大小排序键值对。
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
为了获取股票价格最大或最小的元素,如果我们简单的使用max(prices)或min(prices),得到的结果是'IBM'或'AAPL'。因为当使用字典对象进行获取最大最小值,排序时,默认是使用key进行比较。
若使用min(prices.values())或max(prices.values()),可以得到最小或最大的值,但同时失去了与之相对应的key的信息。min或max有一个key参数,提供定制化的比较函数。因此,上面的写法可以改写为min(prices, key=lambda k: prices[k])或max(prices, key=lambda k: prices[k])。然后,为了获取最小或最大值min_price = prices[min(prices, key=lambda k: prices[k])]。
为了同时获得键值对的信息,同时根据值的大小进行比较,提取最大或最小值。我们可以先构造一个(value, key)的数据,然后使用max或min进行比较。
min_price = min(zip(prices.values(), prices.keys()))。min_price的值为(10.75, 'FB')。prices_sorted = sorted(zip(prices.values(), prices.keys()))。
值得注意的是,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