mathematica里怎麼把一個列表切成不等長的幾段?

例如一個列表{1,2,3,4,5,6,7,8,9,10}

我想把它切成{{1,2,3},{4,5,6},{7,8},{9,10}}

用Partition函數好像實現不了,請教大神有什麼好的函數能實現這一的功能?


謝邀。mma 8版本之後有一個沒有寫在文檔中的內置函數,叫Internal`PartitionRagged,正好滿足你的需求。用法如下:

Internal`PartitionRagged[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {3, 3, 2,
2}]
(*{{1, 2, 3}, {4, 5, 6}, {7, 8}, {9, 10}}*)

雖然doc裡面沒有,但是還是有Information的,可以參考


可以自己寫一個,比如這樣

In[10]:= (*劃分列表,第i部分的長度為lengthlist[[i]]*)
myPartition[list_, lengthlist_] :=
Take[list, # + {1, 0}] /@
Partition[Accumulate[Prepend[lengthlist, 0]], 2, 1]

In[11]:= myPartition[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {3, 3, 2, 2}]

Out[11]= {{1, 2, 3}, {4, 5, 6}, {7, 8}, {9, 10}}


data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
pos = {1, 4, 7, 9, 11};
data1 = Table[data[[pos[[i]] ;; pos[[i + 1]] - 1]], {i, 1, 4}]

分割用;;就行

但是這個一般難度在寫position上,我處理數據要批量,所以會用table或其它判定語句生成position。


更新一種奇怪的方法

可以生成指定長度的list

In[143]:= SymbolicTensors`SymbolicTensorsDump`MultiRange[{3,2,5}]
Out[143]= {{1,2,3},{4,5},{6,7,8,9,10}}

====================================================================================================================================================

一:

In[15]:=Internal`PartitionRagged[{1,2,3,4,5,6,7,8,9,10},{3,3,2,2}]
Out[15]={{1,2,3},{4,5,6},{7,8},{9,10}}

二:

In[16]:= FoldPairList[TakeDrop,{1,2,3,4,5,6,7,8,9,10},{3,3,4}]
Out[16]= {{1,2,3},{4,5,6},{7,8,9,10}}

三:

In[19]:= li=Range[15];
({Take[li,#],li=Complement[li,#]@Take[li,#]}/@{4,5,6})[[All,1]]
Out[20]= {{1,2,3,4},{5,6,7,8,9},{10,11,12,13,14,15}}

四:

In[40]:= li=Range[15];list={};
Do[(AppendTo[list,TakeDrop[li,count][[1]]];li=TakeDrop[li,count][[2]]),{count,{4,5,6}}]
list
Out[42]= {{1,2,3,4},{5,6,7,8,9},{10,11,12,13,14,15}}

五:

In[50]:=
li = Range[15];
Flatten /@ (MapAt[List, li, List /@ Accumulate@{4, 5, 6}] //
SequenceCases[#, {__Integer, {_}}] )
Out[51]= {{1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13, 14, 15}}


推薦閱讀:

簡單的積分,這是不是Mathematica的一個Bug?
「當且僅當」是充要條件嗎?
求問數學大神這種公式結果是怎麼推導出來的?
除法的結果為什麼稱為「商」?
循環論證和充要條件的區別在哪裡?

TAG:Python | 數學 | WolframMathematica |