-1

我想创建一个元组列表,其中第一个元素来自列表,第二个元素来自列表元素的函数,然后从函数的输出中找到最小值。下面的代码最好地解释了我想要什么:

x,y = min((x,f(x) for x in array), key = lambda(k, v): v[1])

运行脚本后,我得到:

SyntaxError: invalid syntax

注意:f(x) 返回 int/float


更新:我从另一个堆栈溢出问题中编写了我的代码,所以我不知道我到底在做什么。有人可以解释一下 key 是如何工作的吗?
感谢您的回答:)

4

4 回答 4

2

您需要添加一些括号:

x, y = min(((x,f(x)) for x in array), key = lambda t: t[1][1])

我调整了 lambda 表达式以在 Python 2 和 3 中工作(您不能在参数列表中使用元组解包)。

请记住,键只是一个函数,它应该返回我们想知道最小值的值。它为输入序列中的每个元素调用。在这种情况下,这是一个(x, f(x))元组,您想通过f(x)返回值的第二个元素找到最小值。

于 2013-03-15T21:21:41.820 回答
1

在您的列表理解中,,不被解析为元组表达式。您需要将其包装()以使解析器知道。

x,y = min(( (x,f(x)) for x in array), key = lambda(k, v): v[1])
于 2013-03-15T21:21:54.117 回答
1

我猜你想要这个:

x,y = min(((x,f(x)) for x in array), key = lambda(k, v): v)
于 2013-03-15T21:22:14.883 回答
1

要么添加缺少的括号,要么像这样重写代码:

y, x = min(zip(map(f, array), array))

我已将元组元素的顺序交换为不必向min().

这是另一个版本:

x = min(array, key=f)
y = f(x)

它简短明了,但需要额外调用f().

于 2013-03-15T21:24:34.313 回答