4

助けを求めたい 2 つのリスト操作があります。私の実装方法はあまりエレガントではないので、専門家から学びたいと思います。

1) 2 つのリストがあるとします。1 つは like{{0,2,4},{1,3,2},{2,0,4}}で、もう 1 つは です{{1,3,7},{2,4,6},{3,1,9}}。値に基づいて、またはいくつかの基準に基づいて最初のリストをフィルタリングし、2 番目のリストで対応する要素を取得したいと考えています。たとえば、ゼロ以外の値に基づいて、取得したい{{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}}}。つまり、最初の要素が同じ場合、それらの 2 番目のリストをグループ化したいと考えています。どうすればこれを美しい方法で行うことができますか?

どうもありがとう。

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

2番目の質問については、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が言ったように、間違いなく最初のものに行く方法です.

2 番目の部分では、これを 1 行で実行できる代替手段を提供したいと思います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}}}}

内部的にSelectEquivalentsReapSowを使用するため、のFirst各要素にタグを付け、要素を使用したいフォームに変換し、フォームの要素を<list>含むリストを返します。利点は、その後の変換なしで必要なものを得るために、1 つのステップですべてを指定できることです。Last{#1, #2}&{Tag, {<items with that tag>}}

于 2011-03-09T15:25:23.080 に答える