[心得] 一個python來的巫術

看板Mathematica作者 (Hysterisis)時間11年前 (2013/03/29 21:00), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串1/1
在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
如果你只是想顛倒,可用Reverse。但我猜你應該是想玩 想練功
03/30 10:28, 1F

03/30 23:06, , 2F
Y,但事實上[[;;;;-1]]還比Reverse@長兩個字XD
03/30 23:06, 2F

04/01 18:14, , 3F
效率呢?我猜Reverse比較快,更何況修改內建函數很危險。
04/01 18:14, 3F
文章代碼(AID): #1HLP1tCW (Mathematica)
文章代碼(AID): #1HLP1tCW (Mathematica)