我有以下字典:
inventory = {'apple':(3, 133), 'banana':(9, 407), 'pear':(17, 205), 'orange':(1, 91)}
我想根据元组中第二个元素的最大值找到键,值对,因此在这种情况下,它应该返回:banana':(9, 407)
我知道我可以使用lambda
获得此结果:
key_max = max(inventory.keys(), key=(lambda k: inventory[k][1]))
print key_max, inventory[key_max]
但是我尝试使用itemgetter()方法接收相同的结果,因为它读取速度更快,但我只能根据元组的第一个元素的值获取数据:
from operator import itemgetter
print max(inventory.iteritems(), key = itemgetter(1))
是否可以使用itemgetter()
方法获得相同的结果?
答案 0 :(得分:2)
在我或其他人提出令人着迷的东西之前
inventory = {'apple':(3, 133), 'banana':(9, 407), 'pear':(17, 205), 'orange':(1, 91)}
maxVal = 0 # to get the max of 2nd elem from tuple
for k,v in inventory.items():
maxVal = max(maxVal, v[1])
for k,v in inventory.items():
if v[1] == maxVal: # if the 2nd elem of tuple eqs to the maxVal
print(k, v)
输出:
banana (9, 407)
注意:我推荐编辑版本。
编辑
使用lambda
:
print(max(inventory.items(), key=lambda x: x[1][1])) # ('banana', (9, 407))
答案 1 :(得分:2)
尽管我看不到本练习的重点...
这是仅使用 itemgetter
和没有lambdas 的解决方案,就像原始问题一样:
key = max(zip(inventory.keys(), map(itemgetter(1), inventory.values())), key=itemgetter(1))[0]
print(key, inventory[key])
# banana (9, 407)
请注意,以上内容仅在Python 3.x 中有效,其中内置函数返回 iterators / view objects 而不是列表。
等效的Python 2.x等效要求使用库函数,例如itertools.izip
:
# from itertools import izip, imap
key = max(izip(inventory.iterkeys(), imap(itemgetter(1), inventory.itervalues())), key=itemgetter(1))[0]
print key, inventory[key]