0

Mathematica.SE中的人顯然有Python-phobia here所以我在這裏問這個問題:什麼相當於Python的列表理解Mathematica中的ZIP?相當於Python的列表理解Mathematica中的Zip?

的Python

>>> [(ii,jj) for (ii,jj) in zip((1,10,100),(2,20,200))] 
[(1, 2), (10, 20), (100, 200)] 
>>> [(ii,jj,kk) for (ii,jj,kk) in zip((1,10,100),(2,20,200),(3,30,300))] 
[(1, 2, 3), (10, 20, 30), (100, 200, 300)] 

數學?

  1. Thread[Times[{1, 11}, {2, 22}]]有點類似,但不等同(失敗?)
  2. 其他方法?
+0

問題似乎被回答。你可以說的是,你的例子太簡單了,不能揭示問題,然後拿出一個更好的例子。 – agentp 2014-09-22 23:29:34

+0

@george你是對的,一般的問題是找到Mathematica和Python之間用於列表理解的類似編程風格 - 我必須考慮如何解決這個難題。我還不知道,也許它是Map。我喜歡Python中的列表理解,我可以用它們做任何事情 - 試圖在Mathematica中挖掘這個機會:) – hhh 2014-09-24 12:11:37

回答

3

如果你只是想重新安排在你的例子中指定的元素,那麼@Alan有正確的答案。從更一般的意義上說,Pythons列表解析與其他語言稱爲「映射」和「過濾器」相同,儘管在您的情況下您似乎沒有使用任何過濾器。 該問題可以分兩步進行分解:

  1. 將某些列表中的元素拉鍊。
  2. 從這個新列表中創建一個新列表。

因此,除了transpose之外,您可能還想使用Map函數。下面是一個示例:

PythonZipMap[func_, list_List] := Map[func, Transpose[list]]; 

該函數首先執行列表的「zip」,然後將表達式應用於每個條目。

list = {{1, 2, 3}, {10, 20, 30}, {100, 200, 300}}; 
PythonZipMap[Identity, list] 
{{1, 10, 100}, {2, 20, 200}, {3, 30, 300}} 
PythonZipMap[Total, list] 
{111, 222, 333} 
PythonZipMap[Median, list] 
{10, 20, 30} 

我真的只是從Mathematica開始,所以我確信其他人會有更好的答案。

---更新---

如果得到的壓縮列表元素應該作爲輸入傳遞給你的函數,你也可以使用MapThread。例如,在上述總可能已經實現這樣的:

MapThread[Plus, list] 
{111, 222, 333} 
+1

我覺得擁有Pythonist和Mathematicanists都可以理解的編程風格,或者更容易適應另一種風格語言,也許地圖是要走的路 - 我還不知道,但測試,很高興看到更多的Pythonists使用Mathematica :) – hhh 2014-09-24 12:09:07

0

Python 2或Python 3? Python 2中實際創建這些對象,在這種情況下,相當於似乎

[email protected]{{1, 10, 100}, {2, 20, 200}} 
[email protected]{{1, 10, 100}, {2, 20, 200}, {3, 30, 300}} 

這忽略了非矩形的情況下,因爲你的例子並沒有提出這個問題。

0
zip[{} ..] := {}; 
zip [p : xs__] /; MemberQ[{p}, {}] := {}; 
zip[p : Repeated[_List, {2, \[Infinity]}]] := Join[Through[{Apply[First[{#}]&, 
{##}, {1}]&}[p]], zip[(Rest[{##1}] & @@@ {p}) /. {x__List} :> Sequence[x]]] 

使用不同長度的列表:

zip[{1, 2, 3}, {4, 5, 6}, {7, 8}, {10, 11, 12}] 
(* {{1, 4, 7, 10}, {2, 5, 8, 11}} *) 

使用相同長度的列表:

zip[{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}] 
(* {{1, 4, 7, 10}, {2, 5, 8, 11}, {3, 6, 9, 12}} *)