2012-05-07 49 views
3

我在Mathematica中有一大串規則,但我想選擇與特定條件相對應的項目。儘管我一直在嘗試使用Select and Take命令,但我一直無法獲得所需的輸出。在mathematica中從列表中選擇項目

示例:假設我想從列表中選擇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

對於未來的Mathematica問題,可能需要查看測試版網站:http://mathematica.stackexchange.com/。 – Hooked

+1

嗨Sosi,如果你喜歡** Perl **和數學,你會愛上[** PDL **](http://pdl.perl.org)**: - )** –

+0

@ G.Cito哇,那就是非常好!!!非常感謝! – Sosi

回答

1

「的期望的輸出將是{A-> 1.2,B-> 2.7,C-> 5.7}」 所以上面的回答應該被壓扁:)

Cases[[email protected], {___, A -> 1.2, ___}] // Flatten 

用N將6/5這樣的東西翻譯成1.2。

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] &] 
2

或者使用Cases

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

+1

事實上,我試過的案件,它非常有效! – Sosi

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]來解決這個問題。

此外,此解決方案忽略列表中規則的順序。

+0

謝謝! 事實上,使用你的建議避免了必須包含'合理化'。 然而,我仍然理解如何在'Select'的標準下有'Equal'允許查找規則。 – Sosi

+0

@SosiKun在文檔中查找'ReplaceAll'。我使用'/ .'運算符來替換規則中的'A'。 – Szabolcs

2

另一種:

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