2011-03-09 78 views
4

我有兩個列表操作,我想要求幫助。我實施它們的方式不是很優雅,所以我想向您學習專家。mathematica中的兩個列表操作

1)假設我有兩個列表,一個是{{0,2,4},{1,3,2},{2,0,4}},另一個是{{1,3,7},{2,4,6},{3,1,9}}。我想要基於這個值,或者基於某個標準來過濾第一個列表,然後在第二個列表中獲取相應的元素。例如,基於非零值,我想要得到{{3,7},{2,4,6},{3,9}}。基於大於2的條件,我想獲得{{7},{4},{9}}

2)我有一個列表,如{{{1,2},{1,1}},{{1,3},{2,4}},{{1,2},{2,3}},{{1,4},{3,3}}}。我想形成{{{1,2},{{1,1},{2,3}}},{{1,3},{{2,4}}},{{1,4},{{3,3}}}。也就是說,如果第一個元素相同,我想將這些第二個列表分組。我怎樣才能以美麗的方式做到這一點?

非常感謝。

回答

11

在第一部分,你想Pick

In[27]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?Positive] 
Out[27]= {{3,7},{2,4,6},{3,9}} 

In[28]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?(#>2&)] 
Out[28]= {{7},{4},{9}} 

對於第二個問題,GatherBy讓你大部分的方式出現:

In[29]:= x = GatherBy[{{{1, 2}, {1, 1}}, {{1, 3}, {2, 4}}, {{1, 2}, 
    {2, 3}}, {{1, 4}, {3, 3}}}, First] 

Out[29]= {{{{1, 2}, {1, 1}}, {{1, 2}, {2, 3}}}, {{{1, 3}, 
    {2, 4}}}, {{{1, 4}, {3, 3}}}} 

然後你就可以申請規則清理東西了一點:

In[30]:= x /. l:{{a_, _}..} :> {a, Last /@ l} 

Out[30]= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}}, 
    {{1, 4}, {{3, 3}}}} 
+0

+1。謝謝。對於第一部分,我想到了「Pick」。但它不允許我在那裏放置一個函數(不像'Select'),是嗎?你如何去> 2案例? – 2011-03-09 05:58:16

+0

我剛剛更新了我的答案,您可以在第三個參數的模式中使用條件。我剛剛清理了我的答案,第二部分也有點太... – 2011-03-09 05:59:36

+4

@Qiang @Michael即使Pick沒有第三個參數,你可以用Pick來完成它,如下所示:'Pick [{{1, 3,7},{2,4,6},{3,1,9}}, Positive @ {{0,2,4},{1,3,2},{2,0,0}}} ]'。你可以在更復雜的情況下使用純函數。請注意,您可以在此處使用@,因爲Positive是可列出的。對於不可列出的函數,使用適當級別的Map。 – 2011-03-09 10:35:11

3

正如邁克爾說的,Pick絕對是第一個去的路。

對於第二部分,我想提供一個替代方案,讓您在一行中執行此操作:SelectEquivalents。 (我知道,而自我提升,但我用這個功能很多。)爲了讓您尋找的結果,只是在<list>進入

In[1] := SelectEquivalents[ <list>, First, Last, {#1,#2}& ] 
Out[1]:= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}}, {{1, 4}, {{3, 3}}}} 

內部,SelectEquivalents使用ReapSow,所以First標籤的每個元素, Last將元素轉換爲我們希望使用的形式,並且​​返回具有{Tag, {<items with that tag>}}形式的元素的列表。好處是你可以在一步中指定所有的東西,在沒有後續轉換的情況下獲得你想要的東西。