mathematica 是否有类似“选择任何”的东西,可以获取满足标准的列表中的任何元素?
5 回答
如果您只想在第一个匹配元素之后返回,请使用可选的第三个参数 to Select
,这是要返回的最大结果数。所以你可以做
Any[list_List, crit_, default_:"no match"] :=
With[{maybeMatch = Select[list, crit, 1]},
If[maybeMatch =!= {},
First[maybeMatch],
default]
Mathematica 缺乏一种很好的方式来表示找不到答案的失败,因为它缺少多个返回值,或者相当于 Haskell 的Maybe
类型。我的解决方案是有一个用户可指定的默认值,这样您就可以确保您传递的东西很容易与有效答案区分开来。
好吧,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 中内置一些东西。使用自制函数会扩大您的程序,但不会带来太多直接好处。
Select函数通过其第三个参数提供了此内置函数,该参数指示要选择的最大项目数:
In[1]:= Select[{1, 2, 3, 4, 5}, OddQ, 1]
Out[1]= {1}
当没有匹配时:
In[2]:= Select[{2, 4}, OddQ, 1]
Out[2]= {}
编辑:哎呀,错过了 nes1983 已经说明了这一点。
有“选择”,它获取所有满足条件的元素。所以
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
你可以相对容易地做到这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