https://stackoverflow.com/a/9868665/433570找到第一项。
在应用上述解决方案之前,我可以考虑先做reverse
。
但最后我会得到两个reverse
,这可能会被避免。
是否有比使用两个reverse
和next
更好的解决方案?
答案 0 :(得分:5)
而不是反转列表,这可能是一个冗长的操作(l.reverse()
),因为它反转整个列表,我只是使用反向迭代器 reversed(l)
使用您想要的任何匹配方法,因为您可以在第一场比赛中提早停止,这可以节省您的时间与倒转整个列表。
当然这两种方法都是最好的情况和最坏的情况,下面可能根据匹配在列表中的位置给你一个想法(例如,到最后,开头或中间)
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())
来使比较值得子>
答案 1 :(得分:0)
x = range(11)
y = next((i for i in reversed(x) if i % 2 == 1), None)
答案 2 :(得分:0)
相关问题中接受的答案建议在列表中使用迭代器来构建仅包含匹配元素的生成器并从该生成器中获取第一个元素:
next(obj for obj in objs if condition)
您可以使用相反的顺序执行相同的操作:
next(objs[i] for i in range(len(objs) -1, -1, -1))
(在Python2中使用xrange
)