2016-06-22 21 views
1

https://stackoverflow.com/a/9868665/433570が最初の項目を見つけます。Pythonの基準に一致する最後の項目を見つけるか?

上記のソリューションを適用する前に、まずreverseと考えることができます。 しかし、私は避けるかもしれない2つのreverseで終わるだろう。

reversenextの2つを使用するよりも優れたソリューションがありますか?

あなたが停止することができますので、それは は、リスト全体を反転させ、私は単に、あなたが好きなマッチング方法で 逆転イテレータ reversed(l)を使用すると思いますので、長時間の操作( l.reverse())であってもよい
+1

もしあなたがnumpyを使いたいなら、 'np.where(np.array(my_list)== criteria_value)[0] [ - 1]' –

答えて

3

代わりのリストを反転させます、最初の試合の早い段階で、リスト全体を逆転させるのに時間を節約できます。

もちろん、以下の最良の場合と両方の方法のための最悪の場合、あなたのアイデアを与える可能性があり(例えば、最後、最初、または中央に向かって)マッチがリストに含まれている場所に基づいて、あります

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()がリストではありません反復子ではありませんので、に必要それは価値のある比較をするためです。

0
x = range(11) 
y = next((i for i in reversed(x) if i % 2 == 1), None) 
+0

、つまりリストの最後の奇数を見つけてください。 – eddiewould

+1

OPの新しいアプローチを提案したので、あなたが何をやっているのか、理由を説明することをお勧めします –

0

関連の質問で受け入れ答えは一致する要素を含む発電機を構築し、その発電機から最初の要素を取るために、リスト上のイテレータを使用することが提案:

next(obj for obj in objs if condition) 

あなたが同じことを行うことができます逆の順序で範囲を使用して:

next(objs[i] for i in range(len(objs) -1, -1, -1)) 

(Python2でxrangeを使用)

関連する問題