Mathematicaの要素の合計に基づいてリスト上でTallyのような操作を行う方法

たとえば、次のようなリストがあります。

{{1, 2, 3}, {6}, {4, 5}, {1, 6}, {2, 2, 3, 2}, {9}, {7}, {2, 5}}

そして、私はリストの要素の合計に基づいて集計されたリストを取得したい。

この場合、出力は次のようになります。

{{6, {{1, 2, 3}, {6}}, {7, {{2, 5}, {1, 6}, {7}}}, {9, {{4, 5}, {2, 2, 3, 2}, {9}}}}}

どのようにMathematicaでこれを便利に行うのですか?

どうもありがとう。

3
そうですか。サイモン、いつものようにありがとう!
追加された 著者 Qiang Li,
これは実際にすべてのインスタンスを格納するため、 Tally のような操作ではありません。 ギャザリングのような操作です。
追加された 著者 Simon,

3 答え

私の試みは、ヨーダのものより少しシンプルです

lst = {{1, 2, 3}, {6}, {4, 5}, {1, 6}, {2, 2, 3, 2}, {9}, {7}, {2, 5}};

{[email protected]@#, #} & /@ GatherBy[lst, Total]

繰り返し要素を必要としない場合は、

{[email protected]@#, Union[#]} & /@ GatherBy[lst, Total]

または、本当に集計のような操作が必要な場合

{[email protected]@#, Tally[#]} & /@ GatherBy[lst, Total]
5
追加された
私の削除。あなたのソリューションは、私が持っていたものよりはるかに単純です(そして、どちらのフォーマットにも正しいフォーマットがありませんでした)。
追加された 著者 abcd,

@Simonと同じようにこれをやっていますが、 Reap Sow も使用できることを忘れないようにしましょう。

Reap[Sow[#, Total[#]] & /@ lst, _, List][[2]]

lst は元のリストです。これは GatherBy ベースのコードよりもやや効率的ではありませんが、かなり高速です。上記のコードを約1.5倍高速化するには、次のように書き換えます。

Reap[Sow @@@ Transpose[{lst, Total[lst, {2}]}], _, List][[2]]

その場合、 GatherBy に基づいたコードの約1.5倍遅くなります。リストが不揃いでパックされていないため、2つの方法の速度の差はそれほど劇的ではないことに注意してください。また、 GatherBy には通常、パックされた配列では速度の利点がありません。

4
追加された
+1することができます(ただし Tr )。
追加された 著者 Mr.Wizard,
@ Mr.Wizard私は Tr - 私の悪いことを忘れています。 upvoteありがとう。
追加された 著者 Leonid Shifrin,

Tr を見逃してはいけません。これはより短く短くなります:

{[email protected]#, {##}} & @@@ GatherBy[lst, Tr]
2
追加された
私はそれを2.095倍速く、79.487%短く測定します! +1
追加された 著者 Simon,