在Mathematica中“选择任何”

时间:2009-07-22 14:34:17

标签: wolfram-mathematica

mathematica是否有像“select any”这样的东西,它可以获得满足标准的列表中的任何元素?

5 个答案:

答案 0 :(得分:7)

如果您只想在第一个匹配元素后返回,请使用Select的可选第三个参数,这是要返回的最大结果数。所以你可以做到

Any[list_List, crit_, default_:"no match"] := 
    With[{maybeMatch = Select[list, crit, 1]},
        If[maybeMatch =!= {},
            First[maybeMatch],
            default]

Mathematica缺乏很好的方法来表示找不到答案的失败,因为它缺少多个返回值,或者相​​当于Haskell的Maybe类型。我的解决方案是拥有用户可指定的默认值,因此您可以确保传递的内容很容易与有效答案区分开来。

答案 1 :(得分:3)

好吧,Eric的答案的缺点是它确实在列表的所有元素上执行OddQ。我的电话费用相对较高,而且经常计算它也感觉不对。而且,随机性的元素显然是不必要的,第一个对我很好。

那么,怎么样

SelectAny[list_List, criterion_] := 
 Catch[Scan[  If[criterion[#], Throw[#, "result"]] &, list]; 
  Throw["No such element"], "result"]

然后

SelectAny[{1, 2, 3, 4, 5}, OddQ]

返回1.

我仍然希望Mathematica内置一些东西。使用家庭酿造功能可以扩大您的计划,而不会带来太多直接的好处。

答案 2 :(得分:3)

Select函数通过其第三个参数提供此内置函数,该参数指示要选择的最大项目数:

In[1]:= Select[{1, 2, 3, 4, 5}, OddQ, 1]
Out[1]= {1}

当没有匹配时:

In[2]:= Select[{2, 4}, OddQ, 1]
Out[2]= {}

编辑:哎呀,错过了nes1983已经说明了这一点。

答案 3 :(得分:1)

有“选择”,它可以获得满足条件的所有元素。所以

In[43]:= Select[ {1, 2, 3, 4, 5}, OddQ ]
Out[43]= {1, 3, 5}

或者你的意思是你想随机选择一个匹配的元素?我不知道内置任何东西,但你可以很快定义它:

Any[lst_, q_] :=
   Select[ lst, q] // (Part[#, 1 + Random[Integer, Length[#] - 1]]) &

您可以使用相同的方式::

 In[51]:= Any[ {1, 2, 3, 4, 5}, OddQ ]
 Out[51]= 3

答案 4 :(得分:1)

您可以使用ScanReturn

轻松完成此操作
fstp[p_, l_List] := Scan[ p@# && Return@# &, l ]

所以

In[2]:= OddQ ~fstp~ Range[1,5]
Out[2]= 1
In[3]:= EvenQ ~fstp~ Range[1,5]
Out[3]= 2

我真的希望Mathematica可以有一些选项让懒惰地评估表达式。在诸如Haskell之类的惰性语言中,您可以将其定义为正常

fstp p = head . filter p