2012-09-11 29 views
2

我有元素的列表:通過應用於每個元素的操作創建新列表?

數據= {{1,2},{2,7},{3,14}}

這是X和Y的列表座標,稍後用於ListPlot。

對於所有的Y座標我基本上想要做Y = 1/Y,這樣一個新的列表變爲:

DataNew = {{1,} 1/2,{2} 1/7 ,{3,1/14}}

我該怎麼做這樣的事情?

回答

3

又例如:

data = {{1, 2}, {2, 7}, {3, 14}}; 
newData = data /. {x_, y_} -> {x, 1/y} 

newData = Cases[data, {x_, y_} -> {x, 1/y}] 

f[{a_, b_}] := {a, 1/b}; 
newData = f /@ data 

和其他可能性的無數。

請記住以小寫字母開始所有您定義的名稱!

+0

很抱歉,但我必須反對票此。在我的答案中給出了推理。 –

5

您可以使用:

{#[[1]], 1/#[[2]]} & /@ Data 
5

隨着data = {{1, 2}, {2, 7}, {3, 14}}我建議:

{#, 1/#2} & @@@ data 

另外,您可以使用:

Replace[data, {x_, y_} :> {x, 1/y}, {1}] 

我建議不要使用這兩種:

data /. {x_, y_} -> {x, 1/y} 

Cases[data, {x_, y_} -> {x, 1/y}] 

都錯誤地使用Rule而非RuleDelayed ,這意味着他們失敗了本地化命名模式。此外,第一是不好的,因爲模棱兩可的介紹了:

{{1, 2}, {2, 7}} /. {x_, y_} :> {x, 1/y} 
{{1, 2}, {1/2, 1/7}} 

二是少麻煩,但恕我直言,因爲Cases是一個過濾功能它不應該被真正使用你在哪裏想要Replace,因爲這會讓代碼不太清晰。


列昂尼德提醒我們,我推薦的方法不會在情況下,這是可能的(如雷亞爾的封裝陣列)自動編譯。如果性能很關鍵,那麼使用下面比較的雙重方法通常是最快的。

dat = RandomReal[99, {50000, 2}]; 

Do[ {#, 1/#2} & @@@ dat , {50}] // Timing 

Do[ Transpose[{#, 1/#2} & @@ [email protected]] , {50}] // Timing 

{2.074,空}

{0.032,空}

+1

+1,但請記住'@@@'不會自動編譯。 –

+0

@Leonid我添加了另一種方法來解決性能問題。 –

+0

一個很好的補充。我也同意'@@@'看起來更好,通常可以在需要時調整性能。 –

相關問題