从Mathematica列表中选择项目

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}
我知道可以根据值从列表中选择项目。但如何从规则列表中执行此操作?
谢谢
编辑:显然,Cases就可以了:
Cases[list,{A-> # | A -> Rationalize [ # ], Rule [ _,_ ]..}]&/ @{1.2}
这也搜索有理和非有理形式的数字,这是我遇到的另一个问题。

4
或许值得考虑查看测试版网站:http://mathematica.stackexchange.com/,以备将来有关Mathematica的问题。 - Hooked
1
嗨Sosi,如果你喜欢Perl和数学,你一定会喜欢PDL的:-)。[http://pdl.perl.org] - G. Cito
@G.Cito 哇,太棒了!!!非常感谢! - Sos
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] &]

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]来解决这个问题。
此外,这个解决方案忽略了列表中规则的顺序。

谢谢! 确实,使用您的建议避免了包含“Rationalize”的必要。 然而,我仍然不明白在Select的标准下拥有Equal如何允许查找规则。 - Sos
@SosiKun 在文档中查找“ReplaceAll”。我使用/.运算符将A替换为规则中的任何内容。 - Szabolcs

2

Or use Cases:

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


2

另一个例子:

Pick[#, A /. #, 1.2]& @ list

1
期望的输出应该是 {A->1.2,B->2.7,C->5.7}。所以上述答案应该被压平 :)
Cases[N@mylist, {___, A -> 1.2, ___}] // Flatten

使用 N 将像 6/5 这样的东西翻译成 1.2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接