Calculating with Dictionaries

2015-06-14  本文已影响32人  Closears

本文主要讨论如何在字典上执行各种操作(诸如求最值,排序等)。

在正式开始前,我们先试着对另一个问题进行理解,问题如下:

prices = {
    'ACME': 45.23,
    'AAPL': 612.78,
    'IBM': 205.55,
    'HPQ': 37.20,
    'FB': 10.75
}

对prices执行print(list(zip(prices.keys(), prices.values())))
执行结果:[('ACME', 45.23), ('IBM', 205.55), ('AAPL', 612.78), ('FB', 10.75), ('HPQ', 37.2)]
(zip() creates an iterator, so we use list to show the results)

我们注意到,由于字典是无序的,所以我们打印出来的内容是无序的,即prices.keys()prices.values()生成的是无序的内容。
然后zip()函数从这两个无序的内容序列中每次各取一个形成元素对,组成list。我们却发现list中的每一个元素对都是匹配的,也就是说,无论我们运行多少次,不管元素对之间的相对顺序如何,但是每个元素对的“键-值”仍然是匹配的。
所以我们可以大胆猜测:这个keys()与values()同时获取了一次字典状态。或者说,当我们请求读取字典时,字典“停留”在某个状态,然后我们再一次性分别对keys与values进行取值。所以“键-值”对应是理所当然的事情啦

下面进入正题:

直接上代码:

min_price = min(zip(prices.values(), prices.keys()))
max_price = max(zip(prices.values(), prices.keys()))
prices_sorted = sorted(zip(prices.values(), prices.keys()))

注意:我们在求最值和排序时,对字典的“键-值”进行了反转(即把values()放在了keys()前面),因为min,max,sorted这三个函数默认以第一个位置的值作为排序依据,所以如果我们没有反转的话,那么排序的依据(在此字典中)就是keys中字符串的字母顺序了。

补充一下:如果第一个位置的值相等的话,就会继续比较第二个位置,以此类推。

另一种方法:

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])]

总结:两种方法各有利弊,需要根据具体情况来判断(虽然这好像是句废话=_=)。。。

上一篇下一篇

猜你喜欢

热点阅读