dlnb526 发表于 2020-3-22 10:51:03

【Cookbook】1.8 字典的运算

第一章:数据结构和算法 » 1.8 字典的运算
问题
怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?{:10_275:}
static/image/hrline/5.gif


解决方案
---
文中的思路只供参考,如果你有更好的解决办法和广大鱼油分享哦!
---
考虑下面的股票名和价格映射字典:

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
static/image/hrline/2.gif

讨论
如果你在一个字典上执行普通的数学运算,你会发现它们仅仅作用于键,而不是值。{:10_329:}比如:

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) # Returns 'FB'
max(prices, key=lambda k: prices) # Returns 'AAPL'
但是,如果还想要得到最小值,你又得执行一次查找操作。比如:

min_value = prices)]
前面的 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')
>>>

static/image/hrline/line7.png

摘自《Python Cookbook》第三版
翻译项目github源地址:yidao620c/python3-cookbook
Copyright (c) 2014-2018 Xiong Neng and other contributors
遵循Apache License 2.0 协议索引贴
暂无待更新~
由于原项目在线阅读不方便,因此转载给各位(才不是水!)Cookbook系列帖子正在不断完善哦,希望能对已经初步了解python以及算法知识的你有所帮助~获取更新欢迎关注淘帖https://fishc.com.cn/forum.php?mod=collection&action=view&ctid=1664{:9_228:}

喜欢记得评分哦!{:7_142:}

qiuyouzhi 发表于 2020-3-22 10:52:11

zltzlt发过。。

一个账号 发表于 2020-3-22 11:37:14

本帖最后由 一个账号 于 2020-3-22 11:49 编辑

qiuyouzhi 发表于 2020-3-22 10:52
zltzlt发过。。

我知道回帖能领鱼币{:10_299:}

qiuyouzhi 发表于 2020-3-22 11:38:49

一个账号 发表于 2020-3-22 11:37
我知道回帖有鱼币

你觉得我缺鱼币?

永恒的蓝色梦想 发表于 2020-3-22 11:59:04

最好的办法就是不用字典(误){:10_248:}

永恒的蓝色梦想 发表于 2020-3-22 12:00:08

为啥我没领到鱼币{:10_255:}{:10_266:}

永远的渣滓 发表于 2020-3-22 18:52:02

{:10_277:}

永远的渣滓 发表于 2020-3-22 19:50:54

{:10_279:}

wuhao4221961 发表于 2020-3-23 09:09:21

慢慢来最快
页: [1]
查看完整版本: 【Cookbook】1.8 字典的运算