Gather verwenden, um meine Daten neu zu ordnen

  • Ich habe eine Liste von Elementen:

     {{1, 2}, {1, 5}, {2, 6}, {3, 7}, {4, 8}, {5, 6}, 
     {5, 9}, {9, 13}, {10,11}, {11, 12}, {11, 15}, {15, 16}}
     

    Ich muss es teilen in Unterlisten, so dass:

     #1[[1]] == #2[[1]] || #1[[1]] == #2[[2]] || #1[[2]] == #2[[1]] || #1[[2]] == #2[[2]] &
     

    dh am Ende muss ich Folgendes erhalten:

     {{{1, 2}, {1, 5}, {2, 6}, {5, 6}, {5, 9}, {9, 13}},
     {3, 7}, {4, 8}, {{10,11}, {11, 12}, {11, 15}, {15, 16}}}
     

    Allerdings kann ich mit [&&4 && keine Lösung finden. ]. Wie kann ich diese Aufgabe erfüllen?

    29 May 2012
    Szabolcs
2 answers
  • Kann mit einigen Grafikberechnungen ausgeführt werden.

     In[585]:= gg = Graph[Apply[UndirectedEdge, ll, {1}]];
    
    In[586]:= comps = ConnectedComponents[gg]
    
    Out[586]= {{1, 2, 5, 6, 9, 13}, {3, 7}, {4, 8}, {10, 11, 12, 15, 16}}
    
    In[587]:= Map[
     Cases[ll, aa_ /; MemberQ[aa, Alternatives @@ #]] &, comps]
    
    Out[587]= {{{1, 2}, {1, 5}, {2, 6}, {5, 6}, {5, 9}, {9, 13}}, {{3, 
       7}}, {{4, 8}}, {{10, 11}, {11, 12}, {11, 15}, {15, 16}}}
     

    Dies könnte effizienter werden. in diesem letzten Schritt. Es ist nur wichtig, wenn Sie dies auf viel größeren Listen tun müssen.

    25 May 2012
    Yaakov Ellis
  • In Version 10.2+ kann der Ansatz von @ Daniel's direkt verwendet werden, indem RelationGraph mit der Beziehung IntersectingQ (Danke: Carl Woll). ConnectedComponents des resultierenden Diagramms liefert das gewünschte Ergebnis:

     data = {{1, 2}, {1, 5}, {2, 6}, {3, 7}, {4, 8}, {5, 6}, {5, 9}, {9, 13}, {10,11}, 
       {11, 12}, {11, 15}, {15, 16}};
    
    ConnectedComponents[RelationGraph[IntersectingQ, data]] 
     

    {{{ 1, 2}, {1, 5}, {2, 6}, {5, 6}, {5, 9}, {9, 13}},
    {{10, 11}, {11, 12}, {11, 15}, {15, 16}},
    {{4, 8}},
    {{3, 7}}}

    26 July 2017
    Mr.Wizard