このリストがあるとしましょう:
l = [5, 4, 2, 7, 1, 8]
2 と 1 の間のすべてを保持し、それ以外はすべて削除したいのですが、これを実現する最もエレガントな方法は何ですか? 私が取得したいのは、これです:
l = [2, 7, 1]
言い換えれば、私は左側の項目の値と右側の項目の値を知っており、それらとその間のすべての値が必要です。残りは削除する必要があります。
これはエレガントではありませんが、高速です
start = l.index(2)
del l[:start]
end = l.index(1)
del l[end+1:]
これはかなりpythonicに見えますが、非常に遅いです:
l = [val for val in l if l.index(2) <= l.index(val) <= l.index(1)]
10000 個の int のリストでは、最初のものは約 100 倍高速で醜いです。両方の長所を活かすには?
編集:
さまざまな答えを試して、それらがどれだけ速く実行されるかを確認することにしました。
s = l.index(start) #1
e = l.index(end, start) + 1
l = l[s:e]
l = l[l.index(start):l.index(end)+1] #2
l[:] = l[l.index(start):l.index(end)+1] #3
リストの長さが 1000 万のオーダーで、開始点のインデックスが数百万の場合、1 は 2 と比較して重要になります。せいぜい (1,000 万の int のリストで)、1 つのスレッドを使用する非常に高速なラップトップで、数百分の 1 秒のパフォーマンス向上について話しています。
3 は明らかに最も遅く、最も多くのメモリを使用します。