Đây là một thủ thuật cổ điển:
list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}
Module[{f},
f[x_] := (f[x] = Sequence[]; x);
Map[f, list, {2}]
]
Để hiểu cách thức hoạt động, xem xét những gì sẽ xảy ra khi f[1]
được đánh giá cho lần đầu tiên. f[1]
sẽ đánh giá thành (f[1]=Sequence[]); 1
, sau đó chỉ cần 1
. Vì vậy, bây giờ một định nghĩa đã được thực hiện cho f[1]
. Lần sau, f[1]
được đánh giá, nó sẽ chỉ đơn giản là đánh giá là Sequence[]
.
Vì vậy, lần đầu tiên f
được đánh giá cho một đối số, nó trả về đối số đó. Thời gian thứ hai (hoặc thứ ba, vv) được đánh giá, nó trả về Sequence[]
. Sequence[]
có thuộc tính sẽ bị xóa hoàn toàn khỏi các biểu thức, tức là {1, Sequence[], 3}
sẽ đánh giá là {1, 3}
.
Để tóm tắt, chức năng thực hiện là: lần đầu tiên nó nhìn thấy một phần tử, nó thay thế phần tử với chính nó (để nó một mình). Lần thứ hai nó thấy cùng một phần tử, nó loại bỏ nó. Tôi đã ánh xạ chức năng này tại "level 2", vì vậy nó sẽ chỉ hoạt động trên các phần tử của danh sách con.
Chào mừng bạn đến với chồng trao đổi. Nice câu hỏi đầu tiên. Bạn cũng có thể muốn biết về trang web Mathematica (beta): http://mathematica.stackexchange.com/ – DavidC