Учитывая этот список кортежей:

my_tuples = [(1,2), (3,4)]

И следующая функция оценки:

def evaluate(item_tuple):
    return item_tuple[0] * 2

Вопрос : как я могу получить элемент списка (кортеж), который имеет наибольшее значение оценки? (Полагаю, я могу использовать для этого понимание списка)


def max_item(tuples_list, evaluation_fn):
    '''Should return the tuple that scores max using evaluation_fn'''
    # TODO Implement

# This should pass
assertEqual((3,4), max_item(my_tuples, evaluate))
0
rtorres 24 Апр 2017 в 17:59

2 ответа

Лучший ответ

Мне удалось сделать это так:

def max_item(tuples_list, evaluation_fn):
    zipped = zip(map(evaluation_fn, tuples_list), tuples_list)
    return max(zipped, key=lambda i:i[0])[1]

Я не знаю, есть ли более простой (более питонический?) Способ решить это.


< EM> Изменить

Я подумал, как можно использовать понимание списка, чтобы сделать его более кратким / читабельным:

def max_item(tuples_list, evaluation_fn):
    return max([(evaluation_fn(i), i) for i in tuples_list])[1]
0
rtorres 24 Апр 2017 в 16:21

Поправьте меня, если я не прав, вы хотите, чтобы список кортежей был отсортирован по результату умножения одного из значений внутри кортежа на x (в приведенном выше примере это будет первое значение кортежа, умноженное на 2).

Если это так, вы можете сделать это следующим образом:

from operator import itemgetter
sorted(l, key=itemgetter(0 * 2), reverse=True)
0
MSKW 24 Апр 2017 в 16:18