1.8 å—典的è¿�算¶
问题¶
æ€Žæ ·åœ¨æ•°æ�®å—兏䏿‰§è¡Œä¸€äº›è®¡ç®—æ“�作(比如求最å°�值ã€�最大值ã€�排åº�ç‰ç‰ï¼‰ï¼Ÿ
解决方案¶
考虑下é�¢çš„股票å��å’Œä»·æ ¼æ˜ å°„å—典:
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
ä¸�幸的是,通常这个结果å�Œæ ·ä¹Ÿä¸�æ˜¯ä½ æƒ³è¦�的。 ä½ å�¯èƒ½è¿˜æƒ³è¦�知é�“对应的键的信æ�¯ï¼ˆæ¯”如那ç§�è‚¡ç¥¨ä»·æ ¼æ˜¯æœ€ä½Žçš„ï¼Ÿï¼‰ã€‚
ä½ å�¯ä»¥åœ¨ min() å’Œ max() å‡½æ•°ä¸æ��ä¾› key 函数å�‚æ•°æ�¥èŽ·å�–最å°�值或最大值对应的键的信æ�¯ã€‚比如:
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() 函数方案通过将å—å…¸â€�å��转â€�为 (值,键) 元组åº�列æ�¥è§£å†³äº†ä¸Šè¿°é—®é¢˜ã€‚
当比较两个元组的时候,值会先进行比较,然��是键。
è¿™æ ·çš„è¯�ä½ å°±èƒ½é€šè¿‡ä¸€æ�¡ç®€å�•çš„è¯å�¥å°±èƒ½å¾ˆè½»æ�¾çš„实现在å—典上的求最值和排åº�æ“�作了。
需è¦�注æ„�的是在计算æ“�作ä¸ä½¿ç”¨åˆ°äº† (值,键) 对。当多个实体拥有相å�Œçš„值的时候,键会决定返回结果。
比如,在执行 min() 和 max() �作的时候,如果�巧最�或最大值有��的,那么拥有最�或最大键的实体会返回:
>>> 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')
>>>