【问题标题】:Mathematica: Determine if all integers in a list are less than a number?Mathematica:确定列表中的所有整数是否都小于一个数字?
【发布时间】:2009-07-26 16:48:09
【问题描述】:

Mathematica 中有没有一种方法可以确定列表中的所有整数是否都小于一个设定的数字。例如,如果我想知道列表中的所有数字是否都小于 10:

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

感谢您的帮助。

【问题讨论】:

    标签: list wolfram-mathematica


    【解决方案1】:

    查看Max function 的列表,它返回列表中的最大数字。从那里,您可以检查此值是否小于某个数字。

    【讨论】:

    • 只是拼写出来:magicFunction[lst_, val_] := Max[lst]<val
    【解决方案2】:

    在提供我的解决方案之前,让我评论一下前两个解决方案。我们将 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之间存在如此大的性能差异。

    【讨论】:

    • Max 和你的 magicFunction4 的时间安排可能是由于 Max 是内置的......虽然我不太确定
    • 实际测量的额外加分
    【解决方案3】:

    这种测试很容易使用'Fold'构建:

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

    短语'(#2

    “&& #1”然后将您当前元素的结果与所有先前元素的结果相结合。

    “真”是基本情况——空列表的结果。

    要查看它是如何工作的,您可以传入一些未定义的值并查看表达式扩展为什么:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2018-09-27
      • 2014-02-17
      相关资源
      最近更新 更多