问题
怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?
解决方案
考虑下面的股票名和价格映射字典:
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()))
max_price = max(zip(prices.values(), prices.keys()))
print('min_price:', min_price)
print('max_price', max_price)
min_price: (10.75, 'FB')
max_price: (612.78, 'AAPL')
类似的,可以使用 zip()
和 sorted()
函数,对字典的值进行排序:
sort_prices = sorted(zip(prices.values(), prices.keys()))
print('sorted_prices:', sort_prices)
sorted_prices: [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]
特别地,zip()
函数创建的是一个只能访问一次的迭代器。 比如,下面的代码就会产生错误:
prices_names = zip(prices.values(), prices.keys())
print(min(prices_names)) #OK
print(max(prices_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 参数可以设置值(value)为最小值或最大值时对应的键,但要获取值(value),需要再执行一次查找操作。例如:
min_key = min(prices, key = lambda x: prices[x])
min_value = prices[min_key]
print('min_key:', min_key)
print('min_value:', min_value)
min_key: FB
min_value: 10.75
通过zip()
函数,可以轻松地在字典上实现求最值和排序。需要注意的是,在执行 min()
和 max()
操作时,如果恰巧最小值或最大值有重复,那么返回最小或最大键的实体,例如:
d = { 'AAA' : 45.23, 'ZZZ': 45.23 }
print('min:', min(zip(d.values(), d.keys())))
print('max:', max(zip(d.values(), d.keys())))
min: (45.23, 'AAA')
max: (45.23, 'ZZZ')