字典的运算

问题
怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?

解决方案
考虑下面的股票名和价格映射字典:

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')
>>>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的字典(dict)是一种无序的键值对集合,可以通过键来快速访问对应的值。下面是几个字典的基本运算: 1. 创建字典 可以使用大括号{}或者dict()函数来创建一个空字典,也可以在大括号里面添加键值对来创建一个非空字典,例如: ``` # 创建空字典 empty_dict = {} empty_dict = dict() # 创建非空字典 person = {'name': 'Alice', 'age': 20, 'gender': 'female'} person = dict(name='Alice', age=20, gender='female') ``` 2. 访问字典元素 可以使用方括号[]来访问字典中的元素,例如: ``` # 访问元素 print(person['name']) # 输出 'Alice' print(person['age']) # 输出 20 ``` 如果访问的键不存在,会抛出KeyError异常。可以使用get()方法来避免这种情况: ``` # 使用get()方法访问元素 print(person.get('name')) # 输出 'Alice' print(person.get('height')) # 输出 None,因为'height'键不存在 print(person.get('height', 170)) # 输出 170,因为'height'键不存在,但是提供了默认值 ``` 3. 修改字典元素 可以使用方括号[]来修改字典中的元素,例如: ``` # 修改元素 person['age'] = 21 print(person) # 输出 {'name': 'Alice', 'age': 21, 'gender': 'female'} ``` 如果修改的键不存在,会创建一个新的键值对: ``` # 修改不存在的键 person['height'] = 170 print(person) # 输出 {'name': 'Alice', 'age': 21, 'gender': 'female', 'height': 170} ``` 4. 删除字典元素 可以使用del关键字来删除字典中的元素,例如: ``` # 删除元素 del person['gender'] print(person) # 输出 {'name': 'Alice', 'age': 21} ``` 5. 遍历字典 可以使用for循环遍历字典中的键值对,例如: ``` # 遍历字典 for key, value in person.items(): print(key, value) ``` 其中,items()方法返回一个包含所有键值对的元组列表,可以使用keys()方法和values()方法分别返回所有键和所有值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值