2

mathematica 是否有类似“选择任何”的东西,可以获取满足标准的列表中的任何元素?

4

5 回答 5

7

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

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

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

于 2009-10-06T23:16:48.947 回答
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 中内置一些东西。使用自制函数会扩大您的程序,但不会带来太多直接好处。

于 2009-07-24T15:30:31.650 回答
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 已经说明了这一点。

于 2010-06-30T04:31:27.787 回答
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
于 2009-07-24T13:55:31.703 回答
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
于 2009-10-06T22:36:01.867 回答