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}}*)
可以自己寫一個,比如這樣
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 |