2015-03-24 3 views
0

У меня есть функция, которая возвращает значения для некоторого списка действий. Мне нужно получить (действие, значение) кортеж для минимального или максимального значения (в зависимости от minmaxFunction).Pythonic способ решить небольшую задачу

minmaxFunction и может быть либо мин или макс:

minmaxFunction = min 
or 
minmaxFunction = max 

Сейчас я использую:

bestValue = None 
bestAction = None 

for action in moves: 
    subValue = someFunction(action) 
    if bestValue is None or minmaxFunction(bestValue, subValue) != bestValue: 
     bestValue = subValue 
     bestAction = action 

return bestAction, bestValue 

Я уверен, что есть лучший (вещий) способ сделать это. Может быть что-то вроде

listOfTuples = [(action, someFunction(action)) for action in moves] 
and here something with reduce() ???? 
+0

Хотите ли вы решение в Python 2.7 или Python 3.x? Я предполагаю, что оба тега могут означать, что решение может быть в другой версии, чем то, что вы используете в настоящее время. – juhist

+0

Ваш код неверен: после 'if' нет отступов, поэтому неясно, должна ли одна или две строки кода находиться внутри' if'. Кроме того, похоже, вы не ожидаете, что мы напишем 'minmaxFunction'; не могли бы вы предоставить его определение? – juhist

+0

@juhist Будет интересно иметь для обоих, но мне действительно нужен Python 2.7. Я добавляю уточнение для minmaxFunction – Avt

ответ

3

Вы можете использовать функцию minmax так же, как вы бы использовать min или max:

lst = [-6,-5,-4,4,5,6] 

def foo(x): 
    return x*x 

minmax = min 

print minmax((foo(x), x) for x in lst)[1] # -4 
2

Отвечает ли это на ваш вопрос:

sorted([(action, someFunction(action)) for action in moves], key=lambda x:x[1])[0] 

Это сортирует список, используя второе значение кортежа в качестве ключа, а затем возвращает первый из массива. Я не был полностью уверен, хотите ли вы первого или последнего; изменить 0 до -1 для последнего.

Смежные вопросы