3

我在 Mathematica 中有一个很大的规则列表,但我想选择与某些标准相对应的项目。尽管我一直在尝试使用 Select 和 Take 命令,但我一直无法获得所需的输出。

示例:假设我想从列表中选择 A->1.2 的项目。

list={{A->1,B->2.1,C->5.2},{A->1.1,B->2.6,C->5.5},{A->1.2,B->2.7,C->5.7},{A->1.3,B->2.9,C->6.1}};

期望的输出是 {A->1.2,B->2.7,C->5.7}

我知道可以根据它们的价值从列表中选择项目。但是我如何从规则列表中做到这一点?

谢谢

编辑:显然,案例可以解决问题:

案例[列表,{A-> # | A-> 合理化[#],规则[_, _] ..}] & /@ {1.2}

这也搜索有理和非有理形式的数字,这是我发现的另一个问题。

4

5 回答 5

3

一种可能性是使用Select

例如

Select[mylist, MemberQ[#, A -> 1] &]

(* {{A -> 1, B -> 2.1, C -> 5.2}}*)

其他例子;

Select[mylist, MemberQ[#, A -> 1.1 |  1.2] &]

Select[mylist, 
 MemberQ[#, A -> 1.1 |  1.2 | 1.3] && FreeQ[#, C -> 6.1] &]
于 2012-05-07T13:48:00.010 回答
3

替代:

Select[list, A == 1.2 /. # &]

此解决方案的优点是它使用Equal代替MatchQ(或等效)。 1.2 == 6/5给出True(数学意义上的比较),而MatchQ[1.2, 6/5]给出False(结构比较)。当然,总是可以MatchQ[1.2, x_ /; x == 6/5]解决这个问题。

此外,此解决方案忽略列表中规则的顺序。

于 2012-05-08T20:07:57.177 回答
2

或使用Cases

Cases[list, {A -> 1.2, ___}]

于 2012-05-07T14:04:04.230 回答
2

另一个:

Pick[#, A /. #, 1.2]& @ list
于 2012-05-13T09:34:13.607 回答
1

“所需的输出将是 {A->1.2,B->2.7,C->5.7}”所以上述答案应该是扁平的 :)

Cases[N@mylist, {___, A -> 1.2, ___}] // Flatten

使用 N 将 6/5 之类的内容转换为 1.2。

于 2012-05-15T20:49:50.890 回答