2011-04-21 17 views
8

我將如何處理將列表中的每個元素應用於函數中的每個參數?有點像Map,除了可變數量的參數。將列表應用於Mathematica中的參數

因此,舉例來說,如果我有一個函數action[x1_,x2_,x3_]:=...,我有一個列表{1,2,3},我將如何創建一個函數來調用actionaction[1,2,3]

我想這個功能能夠處理我改變actionaction[x1_,x2],和別的,也與現在的名單是{1,2},並且現在action[1,2]調用動作。

回答

10

基於「有點像地圖,除了可變數量的參數。」我想你可能會尋找到Apply 1級這是用做:

Apply[function, array, {1}] 

或簡寫:

function @@@ array 

這裏是做什麼的:

array = {{1, 2, 3}, {a, b, c}, {Pi, Sin, Tan}}; 

action @@@ array 
{action[1, 2, 3], action[a, b, c], action[Pi, Sin, Tan]}

我上面使用的術語可能是誤導,並限制了Apply的權力。您應用的表達式action不需要是矩形陣列。它甚至不需要是List{...}或者其元素是列表。下面是一個例子將這些可能性:

args = {1, 2} | f[a, b, c] | {Pi}; 

action @@@ args 
action[1, 2] | action[a, b, c] | action[Pi]
  • args是不是一個List而是一組Alternatives
  • 傳遞給action參數的數量而變化
  • args的元素之一有頭f

觀察到:

  • action取代的args每個元素,不管它可以是頭。
  • args頭部被保留在輸出中,在這種情況下Alternatives(簡稱:a | b | c
+0

你的解決方案和Sasha的有什麼區別?我的意思是,我看到你的'@@@',而他的只有'@@'。他們怎麼可能是相同的? – 2011-04-21 22:33:09

+0

@ d'o-o'b他們是不一樣的,但他們是相同的功能:'應用'。'f @@ {1,2,3}'給出'f [1,2,3]'實際上將'List'替換爲'Level 0'中的'f'(最高級別爲{1,2,3 }')。相比之下,'f @@@ {{1},{2},{3}}'給出{f [1],f [2],f [3]},用'f'代替'List'列表中的_element_或「Level 1」。這也可以通過使用'Apply [f,expression,levelspec]'來實現更深層次的表達式,但是沒有簡寫(比如'@@'或'@@@')。有關levelspec的詳細信息,請參閱Level的幫助。 – 2011-04-21 22:39:14

+0

@Wizard:謝謝! – 2011-04-21 22:41:21

8
Apply[action, {1,2,3}] 

這也可以輸入爲action @@ {1,2,3}

-2

爲什麼不直接用行動[lst_ ListQ?]?

+0

這是你要回答的問題嗎? – 2011-04-22 05:29:40

相關問題