4

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

1)假设我有两个列表,一个是 like {{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}}}。也就是说,如果第一个元素相同,我想对第二个列表进行分组。我怎样才能以一种美丽的方式做到这一点?

非常感谢。

4

2 回答 2

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

对于第二个问题,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}}}}

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

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

Out[30]= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}},
    {{1, 4}, {{3, 3}}}}
于 2011-03-09T05:55:49.570 回答
3

正如迈克尔所说,Pick绝对是第一个要走的路。

对于第二部分,我想提供一种替代方案,让您可以在一行中执行此操作:SelectEquivalents. (我知道,相当自我推销,但我经常使用此功能。)要获得您想要的结果,只需输入

In[1] := SelectEquivalents[ <list>, First, Last, {#1,#2}& ]
Out[1]:= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}}, {{1, 4}, {{3, 3}}}}

在内部,使用SelectEquivalentsandReap标记中的每个元素,将元素转换为我们希望使用的表单,并返回包含表单元素的列表。优点是您可以一步指定所有内容,无需后续转换即可获得所需内容。SowFirst<list>Last{#1, #2}&{Tag, {<items with that tag>}}

于 2011-03-09T15:25:23.080 回答