Python,lambda,找到最小值

6 投票
7 回答
22666 浏览
提问于 2025-04-15 15:26

我有一个foreach函数,它会对里面的每个元素调用指定的函数。我想从这些元素中找出最小值,但我不知道该怎么写一个lambda表达式、函数,甚至是一个类来实现这个功能。感谢大家的帮助。


我这样使用我的foreach函数:

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

或者

o.foreach( I.call )

我不想创建列表或其他对象。我想直接遍历这些元素并找到最小值。

我写了一个类来实现这个功能,但我觉得应该有更好的解决方案:

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方法不是Python的常见做法。我应该让我的类可以被迭代,因为你们的解决方案都是基于列表的,这样一切就会简单很多。

在C#中,像这样的lambda函数没有问题,所以我以为Python也同样强大。

7 个回答

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])
13

Python自带了一个功能,可以很方便地找到列表中的最小值:

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

如果你需要先对列表里的数据进行一些处理,可以使用一个叫做map的功能:

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

或者你也可以用一些更高级的写法,比如列表推导式生成器表达式,比如这样:

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

写一个 foreach 方法并不是很符合 Python 的风格。你最好把它做成一个迭代器,这样就可以和 Python 的标准函数,比如 min 一起使用。

与其写成这样:

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

不如写成这样:

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

现在你可以像这样调用 minmin(myobj)

撰写回答