[心得] 一個python來的巫術
在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)
→
03/30 10:28, , 1F
03/30 10:28, 1F
→
03/30 23:06, , 2F
03/30 23:06, 2F
推
04/01 18:14, , 3F
04/01 18:14, 3F
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章