可能重复: Python: find first element in a sequence that matches a predicate
Python标准库中是否有封装以下控制流模式的高阶函数?
>>> def find(pred, coll):
... for x in coll:
... if pred(x):
... return x
...
>>> find(lambda n : n % 2 == 0, [3, 5, 8, 9, 6])
8
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 6])
6
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 1])发布于 2012-10-17 07:11:37
您可以将ifilter和islice组合起来,以获得第一个匹配元素。
>>> list(itertools.islice(itertools.ifilter(lambda n: n % 2 == 0, lst), 1))
[8]但是,我不认为这比您发布的原始代码更易读或更好。不过,在一个函数中包装起来会好得多。由于next只返回一个元素,因此不再需要islice:
def find(pred, iterable):
return next(itertools.ifilter(pred, iterable), None)如果没有找到元素,则返回None。
但是,您仍然需要对谓词函数每一个循环进行相当慢的调用。请考虑使用列表理解或生成器表达式来代替:
>>> next((x for x in lst if x % 2 == 0), None)
8发布于 2012-10-17 07:12:11
如果您只获取结果可迭代性的第一个元素,itertools.ifilter()就可以做到这一点。
itertools.ifilter(pred, col1).next()类似地,生成器对象也可以这样做(同样,从结果生成器中删除第一项):
(i for i in col1 if i % 2 == 0).next()因为这两个元素都是延迟计算的,所以您只需要计算输入可迭代性的多少,才能得到满足谓词的第一个元素。注意,如果没有匹配谓词,您将得到一个StopIteration异常。您可以通过使用next()内置程序来避免这种情况:
next((i for i in col1 if i % 2 == 0), None)发布于 2012-10-17 07:16:10
我不知道这样的函数在我的头上,但你可以只用一个生成器表达式,并取得第一个结果。
x = (x for x in [3,5,8,9,6] if (lambda n: n % 2 == 0)(x))
y = x.next()或者只是
y = (x for x in [3,5,8,9,6] if (lambda n: n % 2 == 0)(x)).next()https://stackoverflow.com/questions/12928946
复制相似问题