相当于Python';Mathematica的列表理解中的Zip?

相当于Python';Mathematica的列表理解中的Zip?,python,functional-programming,zip,wolfram-mathematica,list-comprehension,Python,Functional Programming,Zip,Wolfram Mathematica,List Comprehension,Mathematica.SE中的人显然有Python恐惧症,所以我在这里问:什么等同于Mathematica的Python列表理解 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))]

Mathematica.SE中的人显然有Python恐惧症,所以我在这里问:什么等同于Mathematica的Python列表理解

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)]
Mathematica?

  • Thread[Times[{1,11},{2,22}]
    有点类似,但并不等价(fail?)
  • 其他方法

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

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

    这将忽略非矩形大小写,因为您的示例没有提出该问题。

    Python2或Python3?Python2实际上创建了这些对象,在这种情况下,等价的

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

    这将忽略非矩形大小写,因为您的示例没有提出该问题。

    Python2或Python3?Python2实际上创建了这些对象,在这种情况下,等价的

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

    这将忽略非矩形大小写,因为您的示例没有提出该问题。

    Python2或Python3?Python2实际上创建了这些对象,在这种情况下,等价的

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

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

    如果您只是希望按照示例中的指定重新排列元素,那么@Alan有正确的答案。在更一般的意义上,Pythons列表理解等同于其他语言所称的“map”和“filter”,尽管在您的例子中,您似乎没有使用任何过滤器。 该问题可分为两个步骤:

  • 压缩某些列表的元素
  • 使用此新列表创建新列表
  • 因此,除了
    转置
    ,您可能还需要使用
    映射
    函数。以下是一个例子:

    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
    。例如,上述总数可能是这样实现的:

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

    如果您只是希望按照示例中指定的方式重新排列元素,那么@Alan的答案是正确的。在更一般的意义上,Pythons列表理解等同于其他语言所称的“map”和“filter”,尽管在您的例子中,您似乎没有使用任何过滤器。 该问题可分为两个步骤:

  • 压缩某些列表的元素
  • 使用此新列表创建新列表
  • 因此,除了
    转置
    ,您可能还需要使用
    映射
    函数。以下是一个例子:

    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
    。例如,上述总数可能是这样实现的:

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

    如果您只是希望按照示例中指定的方式重新排列元素,那么@Alan的答案是正确的。在更一般的意义上,Pythons列表理解等同于其他语言所称的“map”和“filter”,尽管在您的例子中,您似乎没有使用任何过滤器。 该问题可分为两个步骤:

  • 压缩某些列表的元素
  • 使用此新列表创建新列表
  • 因此,除了
    转置
    ,您可能还需要使用
    映射
    函数。以下是一个例子:

    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
    。例如,上述总数可能是这样实现的:

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

    如果您只是希望按照示例中指定的方式重新排列元素,那么@Alan的答案是正确的。在更一般的意义上,Pythons列表理解等同于其他语言所称的“map”和“filter”,尽管在您的例子中,您似乎没有使用任何过滤器。 该问题可分为两个步骤:

  • 压缩某些列表的元素
  • 使用此新列表创建新列表
  • 因此,除了
    转置
    ,您可能还需要使用
    映射
    函数。以下是一个例子:

    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
    。例如,上述总数可能是这样实现的:

    MapThread[Plus, list]
    {111, 222, 333}
    
    使用不同长度的列表:

    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}} *)
    
    使用不同长度的列表:

    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}} *)
    
    使用不同长度的列表:

    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}} *)
    
    使用不同长度的列表:

    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}} *)
    

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