在Python中查找符合条件的最后一项
在Python中查找符合条件的最后一项
https://stackoverflow.com/a/9868665/433570发现第一个项目。
在应用上述解决方案之前,我可以考虑先执行reverse
。
但是那样我会得到两个reverse
,这可能是可以避免的。
是否有比使用两个reverse
和next
更好的解决方案?
问题的出现的原因:原帖中提到需要找到列表中最后一个满足某个条件的数字。然而,在Python中,没有直接找到最后一个满足条件的元素的方法。因此,原帖的提问者寻求其他人的帮助来解决这个问题。
解决方法:在原帖中,有一位回答者提供了一种解决方法。他使用了一个生成器表达式,并结合了reversed函数和next函数来找到列表中最后一个满足条件的数字。具体来说,他首先使用reversed函数将列表逆序排列,然后使用生成器表达式筛选出满足条件(即为奇数)的数字。最后,他使用next函数返回满足条件的数字中的最后一个元素。
下面是代码示例:
x = range(11) y = next((i for i in reversed(x) if i % 2 == 1), None)
这段代码的作用是找到列表x中的最后一个奇数。首先,通过range函数创建了一个包含0到10的整数的列表x。然后,使用生成器表达式筛选出满足条件(即为奇数)的数字,并使用reversed函数将列表逆序排列。最后,使用next函数返回满足条件的数字中的最后一个元素。如果找不到满足条件的数字,则返回None。
这种解决方法的优点是简洁高效。通过使用生成器表达式和reversed函数,可以避免遍历整个列表,从而提高了代码的执行效率。同时,使用next函数可以在找到满足条件的数字后立即停止迭代,从而节省了计算资源。
总结起来,原帖中的问题是如何找到列表中最后一个满足条件的数字。回答者提供了一种通过使用生成器表达式、reversed函数和next函数来解决这个问题的方法。这种方法简洁高效,可以提高代码的执行效率。通过这个解决方法,我们可以更好地应对类似的问题。
(Finding last item that matches criteria in Python)这个问题的出现的原因以及解决方法:
在相关问题的接受答案中,建议使用列表的迭代器来构建一个只包含匹配元素的生成器,并从该生成器中取得第一个元素:
next(obj for obj in objs if condition)
你也可以使用相反顺序的范围来做相同的事情:
next(objs[i] for i in range(len(objs) -1, -1, -1))
(在Python2中使用xrange
)
原因:
问题的出现是因为需要找到列表中满足特定条件的最后一个元素。
解决方法:
解决方法是使用列表的迭代器或范围来构建一个只包含满足特定条件的元素的生成器,并从该生成器中取得最后一个元素。其中一种方法是使用列表的迭代器来构建一个生成器,并使用next
函数来获取生成器的第一个元素,代码如下:
next(obj for obj in objs if condition)
另一种方法是使用范围来构建一个生成器,并使用next
函数来获取生成器的最后一个元素,代码如下:
next(objs[i] for i in range(len(objs) -1, -1, -1))
在Python2中需要使用xrange
来代替range
函数。
通过以上方法,可以找到列表中满足特定条件的最后一个元素。
问题的出现是因为在Python中查找列表中满足特定条件的最后一个元素时,常见的做法是将列表反转,然后使用反转后的列表进行查找。然而,这种方法可能会耗费很长时间,因为它需要反转整个列表。解决这个问题的方法是使用反转迭代器reversed(l)以及所需的匹配方法,因为你可以在找到第一个匹配项后停止查找,这样可以节省时间,相对于反转整个列表的方式。
当然,对于这两种方法来说都有最好情况和最坏情况。下面的例子可以给你一个思路,根据匹配项在列表中的位置(例如,靠近末尾、开头或中间)。
在下面的例子中,我们使用了一个包含100,000个元素的列表l,以及不同匹配项的查找操作。我们使用了%timeit来测量每个查找操作的执行时间。
In [1]: l = range(0, 100000) In [2]: %timeit next((i for i in reversed(l) if i == 1), None) 100 loops, best of 3: 2.94 ms per loop In [3]: %timeit next((i for i in reversed(l) if i == 50000), None) 1000 loops, best of 3: 1.39 ms per loop In [4]: %timeit next((i for i in reversed(l) if i == 99000), None) 10000 loops, best of 3: 29.4 µs per loop
下面是将同一个列表进行反转所需的时间:
In [5]: %timeit l.reverse() 10000 loops, best of 3: 71.5 µs per loop
需要注意的是,上面的实验是在Python 2上进行的,所以range()返回的是一个列表而不是一个迭代器,因此不需要使用list(range())来进行比较。