Python,lambda,找到最小值

时间:2009-10-27 22:37:04

标签: python lambda

我有foreach函数,它在它包含的每个元素上调用指定的函数。我希望从这个元素中得到最少但我不知道如何编写lambda或函数,甚至是一个能够管理它的类。 谢谢你的帮助。

<小时/> 我使用我的foreach函数:

o.foreach( lambda i: i.call() )

o.foreach( I.call )

我不喜欢制作列表或其他对象。我想迭代它并找到min。

我设法写一个做思考的课程,但应该有一个更好的解决方案:

class Min:                                           
    def __init__(self,i):                        
        self.i = i                              
    def get_min(self):                               
        return self.i                                
    def set_val(self,o):                             
        if o.val < self.i: self.i = o.val

m = Min( xmin )
self.foreach( m.set_val )                            
xmin = m.get_min()

好的,所以我想我的.foreach方法是非蟒蛇的想法。我应该做我的Class iterable,因为你所有的解决方案都基于列表,然后一切都会变得更容易。

在C#中,lambda函数没有问题,所以我觉得python也很强大。

7 个答案:

答案 0 :(得分:12)

Python内置了support for finding minimums

>>> min([1, 2, 3])
1

如果您需要先使用函数处理列表,可以使用map执行此操作:

>>> def double(x):
...    return x * 2
... 
>>> min(map(double, [1, 2, 3]))
2

或者您可以使用list comprehensionsgenerator expressions,例如:

>>> min(double(x) for x in [1, 2, 3])
2

答案 1 :(得分:7)

您无法使用foreach和lambda执行此操作。如果您想在功能样式中执行此操作而不实际使用min,则会发现reduce非常接近您尝试定义的函数。

l = [5,2,6,7,9,8]
reduce(lambda a,b: a if a < b else b, l[1:], l[0])

答案 2 :(得分:5)

编写foreach方法不是非常pythonic。你应该更好地使它成为一个迭代器,以便它可以使用标准的python函数,如min

而不是写这样的东西:

def foreach(self, f):
    for d in self._data:
        f(d)

写下这个:

def __iter__(self):
    for d in self._data:
        yield d

现在,您可以将min称为min(myobj)

答案 3 :(得分:1)

好的,您需要了解一件事:lambda为您创建一个函数对象。普通的def也是如此。看看这个例子:

lst = range(10)

print filter(lambda x: x % 2 == 0, lst)

def is_even(x):
    return x % 2 == 0

print filter(is_even, lst)

这两项都有效。它们产生相同的结果。 lambda生成一个未命名的函数对象; def生成一个命名的函数对象。 filter()并不关心函数对象是否具有名称。

因此,如果您lambda的唯一问题是您无法在=中使用lambda,则可以使用def创建一个函数。

现在,我说,我不建议您使用.foreach()方法来查找最小值。相反,让主对象返回值列表,并简单地调用Python min()函数。

lst = range(10)
print min(lst)
编辑:我同意接受的答案更好。 __iter__()并使对象可迭代,而不是返回值列表。

答案 4 :(得分:1)

  

我有foreach函数,它在包含它的每个元素上调用指定的函数

从您随后发布的评论中可以看出,您重新发明了内置的map功能。

听起来你正在寻找这样的东西:

min(map(f, seq))

其中f是您要在列表中的每个项目上调用的函数。

正如gnibbler所示,如果要在x返回最低值的序列中找到值f(x),可以使用:

min(seq, key=f)

...除非您想查找seqf返回最低值的所有项目。例如,如果seq是字典列表,

min(seq, key=len)

将返回列表中包含最少项目数的第一个字典,而不是包含该项目数的所有字典。

要获取函数f返回最小值的序列中所有项的列表,请执行以下操作:

values = map(f, seq)
result = [seq[i] for (i, v) in enumerate(values) if v == min(values)]

答案 5 :(得分:0)

假设你有

>>> seq = range(-4,4)
>>> def f(x):
...  return x*x-2

表示f

的最小值
>>> min(f(x) for x in seq)
-2

表示最小的x值

>>> min(seq, key=f)
0

当然你也可以使用lambda

>>> min((lambda x:x*x-2)(x) for x in range(-4,4))
-2

但这有点难看,地图看起来更好

>>> min(map(lambda x:x*x-2, seq))
-2

>>> min(seq,key=lambda x:x*x-2)
0

答案 6 :(得分:-1)

你可以使用这个:

x = lambda x,y,z: min(x,y,z)
print(x(3,2,1))