本文主要讨论如何在字典上执行各种操作(诸如求最值,排序等)。
在正式开始前,我们先试着对另一个问题进行理解,问题如下:
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])]
总结:两种方法各有利弊,需要根据具体情况来判断(虽然这好像是句废话=_=)。。。
网友评论