[英]Equivalent to Python's Zip in List-comprehension for Mathematica?
Mathematica.SE中的人顯然在這里有Python恐懼症,因此我在這里問:在Mathematica的列表理解中,什么等同於Python的ZIP?
蟒蛇
>>> [(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)]
Mathematica?
Thread[Times[{1, 11}, {2, 22}]]
有點相似但並不等效(失敗?) 如果您只想按照示例中的說明重新排列元素,則@Alan有正確的答案。 從更一般的意義上講,Python列表推導與其他語言稱為“地圖”和“過濾器”的含義相同,盡管在您的情況下,您似乎沒有使用任何過濾器。 該問題可以分為兩個步驟:
因此,除了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}
Python 2還是Python 3? Python 2實際上創建了這些對象,在這種情況下,似乎
Transpose@{{1, 10, 100}, {2, 20, 200}}
Transpose@{{1, 10, 100}, {2, 20, 200}, {3, 30, 300}}
這將忽略非矩形情況,因為您的示例並未引發該問題。
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}} *)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.