L = list # 'list' is a poor variable name, use something else
result = min((n.foo(args) for n in L),
key=lambda x: ClassFred.objects.get(arg1=x))
# if you don't have to use arg1 as a named parameter:
result = min((n.foo(args) for n in L), key=ClassFred.objects.get)
Минимальная функция сравнивает данные элементы и возвращает минимальное один (конечно: P). Вначале не очевидно, что вы можете контролировать, какое значение используется для их сравнения, это параметр «ключ».
>>> L = [-2, -1, 3]
>>> min(L)
-2
>>> min(L, key=abs)
-1
Ключевая функция вычисляет «сравнительный ключ», и это то, что используется для сравнения. Ключевая функция по умолчанию - это идентификатор, где ключ сравнения для элемента является самим элементом.
>>> def identity(x):
... return x
>>> min(L, key=identity)
-2
Другой пример:
>>> min("0000", "11", "222", "3")
"0000" # lexicographical minimum
>>> min("0000", "11", "222", "3", key=len)
"3"
Ваш код выше использует item.foo(args)
в качестве значений, где элемент приходит из списка; но для сравнения используется результат прохождения через ClassFred.objects.get(arg1=..)
. Это означает, что конструкция является вашей ключевой функцией:
values = (n.foo(args) for n in L) # this is a generator expression
# it is similar to a list comprehension, but doesn't compute or store
# everything immediately
def keyfunc(x):
return ClassFred.objects.get(arg1=x)
result = min(values, key=keyfunc)
Мой код в верхней части просто объединяет это в одном заявлении.
вы пытаетесь получить «минимальное» значение? –
Правильно! Очень проницательный для вас :) ClassFred - это класс заказа, но не полностью для заказа; поэтому я переименовал его. +1 для того, чтобы исследовать мой мозг и заставлять меня думать! :) – Alex
Все желающие +1 Отличный ответ Роджера Пате, это отличное объяснение с отличными примерами кода для тех, кто пытается понять функцию лямбда :) – Alex