【问题标题】:Equivalent to Python's Zip in List-comprehension for Mathematica?相当于 Python 在 Mathematica 的列表理解中的 Zip?
【发布时间】:2014-11-17 00:30:00
【问题描述】:

Mathematica.SE 中的人显然有 Python 恐惧症 here,所以我在这里问这个问题:在 Mathematica 的列表理解中,什么相当于 Python 的 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. 其他方法?

【问题讨论】:

  • 问题似乎已得到解答。你只能说你的例子太简单了,无法揭示问题,然后想出一个更好的例子。
  • @george 你说得对,一般问题是在 Mathematica 和 Python 之间找到类似的编程风格以进行列表理解——我必须考虑如何解决这个难题。我还不知道,也许是地图。我喜欢 Python 中的列表理解,我可以用它们做任何事情——试图在 Mathematica 中挖掘这个机会:)

标签: python functional-programming zip wolfram-mathematica list-comprehension


【解决方案1】:

如果您只想重新排列示例中指定的元素,那么@Alan 有正确的答案。在更一般的意义上,Python 的列表推导等同于其他语言所称的“映射”和“过滤器”,尽管在您的情况下您似乎没有使用任何过滤器。 问题可以分为两步:

  1. 压缩某些列表的元素。
  2. 从这个新列表中创建一个新列表。

所以除了transpose,您可能还想使用Map 函数。这是一个例子:

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

此函数首先对列表执行“压缩”,然后将表达式应用于每个条目。

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。例如,上面的 Total 可以这样实现:

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

【讨论】:

  • 我发现拥有这样一种编程风格是很聪明的但正在测试中,很高兴看到更多 Pythonists 使用 Mathematica :)
【解决方案2】:

Python 2 还是 Python 3? Python 2 实际上创建了这些对象,在这种情况下似乎是等价的

Transpose@{{1, 10, 100}, {2, 20, 200}}
Transpose@{{1, 10, 100}, {2, 20, 200}, {3, 30, 300}}

这忽略了非矩形的情况,因为您的示例没有引发该问题。

【讨论】:

    【解决方案3】:
    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}} *)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多