12

私は多くの要素のリストを持っています。

a私はその要素の2つ、およびを気にしbます。

リストの順序も、並べ替えもわかりません。

以前に発生したTrue場合に戻り、それ以外の場合はfalseになる優れたワンライナーはありますか?ab

4

4 に答える 4

9

多様性のために、次のこともできます。

b in l[l.index(a):]

これはのTrue場合になりますa == b。あなたがそれを知っているならa != b

b in l[l.index(a) + 1:]
于 2011-12-07T08:21:55.057 に答える
8

編集:より多くのケースをチェックするために書き直されました

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つのソリューションすべてが半分の時間で勝ちます(または勝者と結びつきます)ので、実際のデータでどちらの方法が最も効果的かはわかりません。おそらく、最も読みやすいものを使用することをお勧めします。

于 2011-12-07T08:33:43.293 に答える
7

あなたが使用することができますlist.index

l.index(a) < l.index(b)

もちろん、これは両方のアイテムがリストに存在することを前提としています。

于 2011-12-07T08:19:33.180 に答える
5

Mark Byersからの応答は正常に機能しますが、リストが長く、両方の要素が終わりに近い場合は、あまり効率的ではありません。

リストを1回だけトラバースするには、次を使用できます。

l.index(b, l.index(a))

ValueErrorこれは必要に応じてワンライナーですが、とにかく例外をキャプチャする必要があります。

于 2011-12-07T08:25:52.087 に答える