목록 순서
Sep 08 2020
누구든지 'list1'에서 'list2'를 얻는 방법을 알고 있습니까? ... ... 혼란스러워서. 이 알고리즘은 매우 큰 목록에 사용됩니다.
list1 = {{1, 35, 3}, {1, 896, 1}, {2, 3, 999}, {1, 212, 5}, {1, 243, 1}, {3, 2, 88}, {1, 903, 3}, {35, 1, 9}, {1, 914, 1}, {1, 925, 2}, {896, 1, -6}};
list2={{{1, 35, 3}, {35, 1, 9}}, {{1, 896, 1}, {896, 1, -6}}, {{2, 3, 999}, {3, 2, 88}}, {1, 212,5}, {1, 243, 1}, {1, 903, 3}, {1, 914, 1}, {1, 925, 2}};
물론 순서는 중요하지 않습니다. 가장 중요한 것은 요소 # 1 [[1]] == # 2 [[2]] || # 1 [[2]] == # 2 [[1]]이 하나의 하위 목록에 있습니다.
답변
5 kglr Sep 08 2020 at 19:57
Gather[list1, #[[;;2]] == Reverse @ #2[[;;2]] &] /. {x_} :> x
{{{1, 35, 3}, {35, 1, 9}}, {{1, 896, 1}, {896, 1, -6}}, {{2, 3, 999}, {3, 2, 88}}, {1, 212, 5}, {1, 243, 1}, {1, 903, 3}, {1, 914, 1}, {1, 925, 2}}
입력 목록이 트리플 목록 인 경우 Most[#]대신 사용할 수도 있습니다 #[[;; 2]] &.
또한 list1사용에 대한 그래프를 구성 하고 동일한 그룹을 얻기 위해 RelationGraph찾을 수 있습니다 ConnectedComponents.
relation = #[[;; 2]] == Reverse @ #2[[;; 2]] &;
ConnectedComponents @ RelationGraph[relation, list1] /. {x_} :> x
{{{2, 3, 999}, {3, 2, 88}}, {{1, 896, 1}, {896, 1, -6}}, {{1, 35, 3}, {35, 1, 9}}, {1, 925, 2}, {1, 914, 1}, {1, 903, 3}, {1, 243, 1}, {1, 212, 5}}