5

リスト内のすべての整数が設定された数よりも小さいかどうかをMathematicaで判断する方法はありますか?たとえば、リスト内のすべての数値が10未満であるかどうかを知りたい場合は、次のようにします。

theList = {1, 2, 3, 10};
magicFunction[theList, 10]; --> returns False

ご協力いただきありがとうございます。

4

3 に答える 3

7

リストの最大数を返すリストのMax関数を調べます。そこから、この値が特定の数値よりも小さいかどうかを確認できます。

于 2009-07-26T16:50:41.117 に答える
6

私のソリューションを提供する前に、前の 2 つのソリューションについてコメントさせてください。Joey Robert のソリューションを magicFunction1、Eric のソリューションを magicFunction2 と呼びましょう。

magicFunction1 は非常に短くエレガントです。私が気に入らないのは、非常に大きな数のリストがあり、最初のリストがすでに 10 より大きい場合でも、必要のない最大数を計算するすべての作業を行うことです。これは、magicFunction2 にも適用されます。

次の2つのソリューションを開発しました。

magicFunction3[lst_, val_] := 
 Position[# < val & /@ lst, False, 1, 1] == {}

magicFunction4[lst_, val_] := 
 Cases[lst, x_ /; x >= val, 1, 1] == {}

私が見つけたベンチマークを行う

In[1]:= data = Table[RandomInteger[{1, 10}], {10000000}];

In[2]:= Timing[magicFunction1[data, 10]]
Out[2]= {0.017551, False}

In[2]:= Timing[magicFunction2[data, 10]]
Out[2]= {10.0173, False}

In[2]:= Timing[magicFunction3[data, 10]]
Out[2]= {7.10192, False}

In[2]:= Timing[magicFunction4[data, 10]]
Out[2]= {0.402562, False}

だから私の最良の答えはmagicFunction4ですが、なぜそれがmagicFunction1よりも遅いのかはまだわかりません. また、magicFunction3 と magicFunction4 の間にこれほど大きなパフォーマンスの違いがある理由も無視しています。

于 2009-07-29T14:04:10.360 に答える
3

この種のテストは、'Fold' を使用して簡単に作成できます。

magicFunction[ lst_, val_ ] :=
 Fold[ ((#2 < val) && #1) &, True, lst ]

「(#2 < val)」というフレーズは、各リスト要素 (「#2」) のテストです。必要なテストをここに置くことができるので、Max のようなリスト可能な関数よりも強力なテストを行うことができます。

「&& #1」は、現在の要素の結果を以前のすべての要素の結果と結合します。

そして、'True' は基本ケースであり、空のリストの結果です。

それがどのように機能するかを確認するには、いくつかの未定義の値を渡し、式が何に展開されるかを確認します。

In[10]:= magicFunction[ {a, b, c}, 10 ]

Out[10]= c < 10 && b < 10 && a < 10
于 2009-07-26T17:04:49.107 に答える