私は多くの要素のリストを持っています。
a
私はその要素の2つ、およびを気にしb
ます。
リストの順序も、並べ替えもわかりません。
以前に発生したTrue
場合に戻り、それ以外の場合はfalseになる優れたワンライナーはありますか?a
b
私は多くの要素のリストを持っています。
a
私はその要素の2つ、およびを気にしb
ます。
リストの順序も、並べ替えもわかりません。
以前に発生したTrue
場合に戻り、それ以外の場合はfalseになる優れたワンライナーはありますか?a
b
多様性のために、次のこともできます。
b in l[l.index(a):]
これはのTrue
場合になりますa == b
。あなたがそれを知っているならa != b
、
b in l[l.index(a) + 1:]
OK、この問題にはもう少し作業が必要です。Mark Byersは、私の最初のテストで結果がになるケースのみをカバーしたという点で完全に正しいTrue
です。他のソリューションには例外ハンドラーが必要なため、これは特に重要です。だから私はもう少し詳しく説明しました:
stmts = {
"Mark Byers: ": "x = l.index(a) < l.index(b)",
"jcollado: ": """try:
x = bool(l.index(b, l.index(a)))
except ValueError:
x = False""",
"Greg Hewgill: ": """try:
x = b in l[l.index(a):]
except ValueError:
x = False"""
}
setups = ["a = 80; b = 90; l = list(range(100))",
"a = 5; b = 10; l = list(range(100))",
"a = 90; b = 80; l = list(range(100))",
"a = 10; b = 5; l = list(range(100))"]
import timeit
for se in setups:
print(se)
for st in stmts:
print(st, timeit.timeit(stmt=stmts[st], setup=se))
print()
結果:
a = 80; b = 90; l = list(range(100))
Mark Byers: 5.760545506106019
Greg Hewgill: 3.454101240451526 # Tie!
jcollado: 3.4574156981854536 # Tie!
a = 5; b = 10; l = list(range(100))
Mark Byers: 1.0853995762934794 # Close runner-up!
Greg Hewgill: 1.7265326426395209
jcollado: 1.0528704983320782 # Winner!
a = 90; b = 80; l = list(range(100))
Mark Byers: 5.741535600372806
Greg Hewgill: 3.623253643486848 # Winner!
jcollado: 4.567104188774817
a = 10; b = 5; l = list(range(100))
Mark Byers: 1.0592141197866987 # Winner!
Greg Hewgill: 4.73399648151641
jcollado: 4.77415749512712
したがって、jcolladoのメソッドによる効率の向上は、ほとんどの場合、例外ハンドラーのコストによって消費されます(特にトリガーされた場合)。3つのソリューションすべてが半分の時間で勝ちます(または勝者と結びつきます)ので、実際のデータでどちらの方法が最も効果的かはわかりません。おそらく、最も読みやすいものを使用することをお勧めします。
あなたが使用することができますlist.index
:
l.index(a) < l.index(b)
もちろん、これは両方のアイテムがリストに存在することを前提としています。
Mark Byersからの応答は正常に機能しますが、リストが長く、両方の要素が終わりに近い場合は、あまり効率的ではありません。
リストを1回だけトラバースするには、次を使用できます。
l.index(b, l.index(a))
ValueError
これは必要に応じてワンライナーですが、とにかく例外をキャプチャする必要があります。