mathematica是否有像“select any”这样的东西,它可以获得满足标准的列表中的任何元素?
答案 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)
您可以使用Scan
和Return
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