我有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也很强大。
答案 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 comprehensions和generator 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)
...除非您想查找seq
中f
返回最低值的所有项目。例如,如果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))