作者jurian0101 (Hysterisis)
看板Mathematica
標題[心得] 一個python來的巫術
時間Fri Mar 29 21:00:36 2013
在python裡,想把list顛倒,有個近乎巫術式的寫法
range(10)[::-1] => [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
*Note list[初:終:步長] python語叫做list的slice,上面
是省略掉起點與終點的寫法,於是python自動研判是倒過來取整個序列。
對應到mathematica(MMA)的
Part[list, Span[初,終,步長]] <=> list[[初;;終;;步長]]
- - - - - -
問題是MMA裡這種巫術作用不成 (起碼在我的MMA7還不行)
In[1]: Range[10][[;; ;; -1]]
從錯誤訊息中可以看出端倪:當步長是負的,起點指標應該要比終點大,
無論在python或MMA皆然。
問題是Span前兩個參數,若省略會自動補上 1 跟 All,也就是
Range[10][[;; ;; -1]] -> Range[10][[1;; All;; -1]] 而產生錯誤
python聰明的補上了掉換過,前大後小的指標 <--真巫術也
**疑問:「怎麼看系統內建函數的default?」說明文件找不到,請高手解答
- - - - - -
再看一眼 range(10)[::-1],這種有趣的東西怎麼移植到MMA?
In[]:
Unprotect[Span, Part];
Part[x_List, Span[1, All, k_]] /; k < 0 := Part[x, Span[All, 1, k]];
Protect[Span, Part]
(*這個時候,薑薑!*)
In[]:
Range[10][[;; ;; -1]]
Out[]: {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
(*想復原則輸入
Unprotect[Span, Part]; Clear[Span, Part]; Protect[Span, Part]
或者 (顯示為走火入魔)
CompoundExpression@@ Through[{Unprotect, Clear, Protect}[Span, Part]]
*)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.213.88
※ 編輯: jurian0101 來自: 140.112.213.88 (03/29 22:34)
→ akrsw:如果你只是想顛倒,可用Reverse。但我猜你應該是想玩 想練功 03/30 10:28
→ jurian0101:Y,但事實上[[;;;;-1]]還比Reverse@長兩個字XD 03/30 23:06
推 sunev:效率呢?我猜Reverse比較快,更何況修改內建函數很危險。 04/01 18:14