2013-02-14 44 views
1

这比任何事情都更加出于好奇,因为我有工作。什么是“最干净”的方式来实现这一点?给出像这样的对元组的列表,如[(Object, int), (Object1, int1), ... ],找到最大的int并返回与该值关联的int和object。元组,最大值和清洁迭代

我做的“讨巧”像这样:

bestObject, bestVal = None, 0 
for i in range(len(tuple_list)): 
    obj, val = tuple_list[i] 
    if val > bestVal: 
     bestObject, bestVal = obj, val 
return bestObject, bestValue 

能不能做到更好?

回答

1

马克斯将在一个元组比较第一项,所以怎么样:

max_val, max_obj = max([(val, obj) for obj, val in tuple_list]) 
return max_obj, max_val 
+0

这就是我正在寻找的。好想法。我仍然遇到了“嵌套”的问题,用于python中的a,b in for y,z'功能。 – Clev3r 2013-02-14 19:07:42

4

max函数提供了一个key参数,您可以在其中准确指定要在比较中使用的参数。例如:

In [1]: class MyObject(object): 
    ...:  def __init__(self, a): 
    ...:   self.a = a 
    ...:   

In [2]: a = MyObject('something') 

In [3]: b = MyObject('something else') 

In [4]: c = MyObject('another thing??') 

In [5]: tups = [(a, 1), (b, 5), (c, 2)] 

In [6]: max(tups, key=lambda x: x[1]) 
Out[6]: (<__main__.MyObject at 0x26c17d0>, 5) 
+0

感谢您的彻底性,虽然有点更加混乱比我希望的。 – Clev3r 2013-02-14 19:08:37

+0

@Clever没问题:)这个想法是'key'函数提供了一个确定'max'的特殊方法。如果你有'('猫',4),('狗',2),('猴',1)',采取正常的最大会返回'('monkey',1)'',因为'猴子'是排序字符串时最大的“值”。如果您希望根据元组的数字元素来查找最大值,那么可以使用'key',然后使用一个函数来提取您想要使用的函数。这里我们使用'lambda x:x [1]',这意味着'当你从这个列表中获得一个项目时,根据元组中的第二项来比较它。这会返回'('cat',4)'。 – RocketDonkey 2013-02-14 19:15:28

+0

啊,这有帮助。假设我有一个字典映射'{id_:[val1,val2,val3]}'。我怎样才能应用这种相同的技术来“查看字典中的所有val [0]索引”并返回最大值? – Clev3r 2013-02-14 21:32:56