使用itemgetter()方法根据元组的第二个值在字典中查找键,值对

时间:2019-03-22 14:27:21

标签: python dictionary tuples

我有以下字典:

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()方法获得相同的结果?

2 个答案:

答案 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]