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

在提供我的解决方案之前,让我评论前两个解决方案。让我们调用 Joey Robert 的解决方案 magicFunction1 和 Eric 的解决方案 magicFunction2。

magicFunction1 非常简洁优雅。我不喜欢它的是,如果我有一个非常大的数字列表并且第一个数字已经大于 10,它仍然会完成所有工作来找出不需要的最大数字。这也适用于magicFunction2

我开发了以下两种解决方案:

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

这种测试很容易使用“折叠”构建:

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 回答