簡體   English   中英

等同於Mathematica的列表理解中的Python Zip?

[英]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?

  1. Thread[Times[{1, 11}, {2, 22}]]有點相似但並不等效(失敗?)
  2. 其他方法?

如果您只想按照示例中的說明重新排列元素,則@Alan有正確的答案。 從更一般的意義上講,Python列表推導與其他語言稱為“地圖”和“過濾器”的含義相同,盡管在您的情況下,您似乎沒有使用任何過濾器。 該問題可以分為兩個步驟:

  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}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM