2012-10-25 88 views
6

這是Mathematica中列表操作的一個基本問題。 我有一個大的列表,其中每個元素具有以下示意圖:{List1,List2,Number}。例如,對於從嵌套列表中快速提取元素

a = {{{1,2,3},{1,3,2},5},{{1,4,5},{1,0,2},10},{{4,5,3},{8,3,4},15}}}

我想創建一個新的列表,只有每個子列表中有一些部分。例如,從每個子列表中挑選第三個元素,從上面給出{5,10,15}。或者放棄第三個元素返回{{{1,2,3},{1,3,2}},{{1,4,5},{1,0,2}},{{4,5, 3},{8,3,4}}}。

我可以通過使用table命令來構建新的列表,例如爲此,

Table[a[[i]][[3]],{i,1,Length[a]} 

但我想知道如果有一個必須更快地將其在大名單的工作。

回答

7

在數學5及更高版本,您可以使用關鍵字所有以多種方式來指定一個列表遍歷

例如,而不是你的表,你可以寫

a[[All,3]] 

這裏Mathematica將所有轉換爲第一維的所有可接受的索引然後sion接下一個維度的第三個維度。

這樣做通常比使用Mathematica編程語言進行循環更有效。對於同質列表,其中您想要選取或掃描的內容始終存在,這確實很好。

另一種有效的符號和捷徑是:;;語法:

a[[ All, 1 ;; 2]] 

將掃描的第一級,並採取一切從1日到每個子列表的2ST元素,酷似你的第二個案例。

其實所有和;;可以結合到任何級別。 ;;甚至可以在類似於數學任何迭代的方式來使用:

a[[ start;;end;;step ]] 

會做同樣的事情

Table[ a[[i]], {i,start,end,step}] 

,你可以省略開始,結束或步驟之一,它充滿了默認值爲1,長度[(隱式列表)]和1.

您可能想要在Mathematica的幫助中查找的另一件事是ReplacePartMapAt,允許以編程方式替換結構化表達式。有效使用這一點的關鍵在於,在ReplacePart中,您可以使用patterns來指定要替換的東西的座標,並且可以定義適用於它們的函數。

與您的數據

ReplacePart[a, {_, 3} -> 0] 

實例將取代每個子表的每一個第三部分以0

ReplacePart[a, {i : _, 3} :> 2*a[[i, 3]]] 

將每個子表的每一個第三部分的兩倍。

+0

謝謝;這是我正在尋找的。 – bartimaeus

+1

請注意,對於其他問題,您也可以在http://mathematica.stackexchange.com上詢問 – ogerard

1

可以使用Part(這個簡寫[[...]])

a[[All, 3]] 

a[[All, {1, 2}]] 
2

正如筆者建議的基礎上,部分的方法需要形成良好的數據,但案件是專爲列表的穩健分離:

用你一個,

a = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}}; 

Cases[a,{_List,_List,n_}:>n,Infinity] 

{5, 10, 15} 

的其他部分的記錄可以通過類似的形式提取。

基於部分的方法將GAG對病態的數據,如:

badA = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 4}}; 

badA[[All,3]] 

{{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 
4}}[[All, 3]] 

,但案件將跳過垃圾,只有在符合數據

Cases[badA, {_List, _List, s_} :> s, Infinity] 

{5, 10, 15} 

心連心操作,

Fred Klingener