mathematica中的两个列表操作

Qia*_* Li 4 wolfram-mathematica list-manipulation

我有两个列表操作,我想请求帮助.我实现它们的方式不是很优雅,所以我想向你们的专家学习.

1)假设我有两个列表,一个是喜欢{{0,2,4},{1,3,2},{2,0,4}}而另一个是{{1,3,7},{2,4,6},{3,1,9}}.我想要根据值,或者基于某些标准来过滤第一个列表,然后在第二个列表中获取相应的元素.例如,基于非零值,我想得到{{3,7},{2,4,6},{3,9}}.根据大于2的条件,我想得到{{7},{4},{9}}.

2)我有一个列表,如{{{1,2},{1,1}},{{1,3},{2,4}},{{1,2},{2,3}},{{1,4},{3,3}}}.我想形成{{{1,2},{{1,1},{2,3}}},{{1,3},{{2,4}}},{{1,4},{{3,3}}}.也就是说,如果第一个元素相同,我想将这些第二个列表分组.我怎么能以漂亮的方式做到这一点?

非常感谢.

Mic*_*lat 11

对于第一部分,您需要Pick:

In[27]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?Positive]
Out[27]= {{3,7},{2,4,6},{3,9}}

In[28]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?(#>2&)]
Out[28]= {{7},{4},{9}}
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,GatherBy让你大部分时间到达那里:

In[29]:= x = GatherBy[{{{1, 2}, {1, 1}}, {{1, 3}, {2, 4}}, {{1, 2}, 
    {2, 3}}, {{1, 4}, {3, 3}}}, First]

Out[29]= {{{{1, 2}, {1, 1}}, {{1, 2}, {2, 3}}}, {{{1, 3}, 
    {2, 4}}}, {{{1, 4}, {3, 3}}}}
Run Code Online (Sandbox Code Playgroud)

然后你可以应用一个规则来清理一下:

In[30]:= x /. l:{{a_, _}..} :> {a, Last /@ l}

Out[30]= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}},
    {{1, 4}, {{3, 3}}}}
Run Code Online (Sandbox Code Playgroud)

  • @Qiang @Michael即使Pick没有第三个参数,你可以用Pick完成它,如下所示:`选择[{{1,3,7},{2,4,6},{3,1, 9}},Positive @ {{0,2,4},{1,3,2},{2,0,4}}]`.您可以在更复杂的情况下使用纯函数.请注意,您可以在此处使用@,因为Positive是可列表的.对于非可列表函数,请使用适当级别的Map. (4认同)