首页 > 解决方案 > 查找与条件匹配的行中的最后一个元素

问题描述

除了这个问题“ Get the first item from an iterable that match a condition ”之外,我还需要第一个匹配之前的元素。或完全等价:一行中与条件匹配的最后一个元素。例如,如果我需要此列表中第一个非素数之前的最后一个素数[2, 3, 4, 5, 6, 7, 8, 9],则答案为 3。如果没有这样的元素,结果可能是无、异常或默认值。

直接的解决方案是:

result = None
for x in numbers:
    if is_prime(x):
        result = x
    else:
        break

是否有一个简单的单线可以解决任务?

标签: pythongeneratoriterable

解决方案


不确定是否有更简单的方法。我的方法需要itertools.takewhile.

  1. 用于itertools.takewhile在不再满足条件后停止迭代以创建素数列表,直到出现第一个非素数,即[2, 3]
  2. 然后用于list[-1]获取列表的最后一个元素。
  3. 如果列表为空,请使用(list or [None])[-1]使其返回None
import itertools
result = ([x for x in itertools.takewhile(lambda n: is_prime(n), numbers)] or [None])[-1]

集合.deque()

from collections import deque
result = (deque((itertools.takewhile(lambda n: is_prime(n), numbers)), maxlen=1) or [None]).pop()

推荐阅读