字典相关的计算场景

字典对象(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

posted @ 2019-08-01 16:23  Jeffrey_Yang  阅读(213)  评论(0编辑  收藏  举报