Thứ tự danh sách

Sep 08 2020

Có ai biết cách lấy 'list2' từ 'list1' không? ... ... bởi vì tôi đã nhầm lẫn. Thuật toán sẽ được sử dụng cho các danh sách rất lớn.

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

Tất nhiên, thứ tự không quan trọng. Điều quan trọng nhất là các phần tử # 1 [[1]] == # 2 [[2]] || # 1 [[2]] == # 2 [[1]] nằm trong một danh sách phụ.

Trả lời

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

Nếu danh sách đầu vào là danh sách bộ ba, bạn cũng có thể sử dụng Most[#]thay cho #[[;; 2]] &.

Chúng ta cũng có thể xây dựng một biểu đồ list1bằng cách sử dụng RelationGraphvà tìm nó ConnectedComponentsđể có được các nhóm giống nhau:

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