nthcdr为隐藏函数
- (defun mposition(lst ens / n);;;列出ens表内各个元素的lst中所有出现位置
- (setq n(length lst))
- (mapcar(function(lambda(x / i l l1)
- (setq l lst)
- (while(setq i(vl-position x l))
- (setq l1(cons(+ i n(-(length l)))l1)
- l(nthcdr(1+ i)l)))
- (reverse l1)))ens))
(mposition'(2 5 6.6 5 8.982 7 2.3 7 3.4 6 8.982 5 6 1.6 9 3.4 2 3 7 8.5 8.982 9)'(2 7))
((0 16) (5 7 18))
- (defun everyposition(lst / n l2);;;lst表内各元素在表内所有出现位置
- (setq n(length lst)m -1)
- (vl-every(function(lambda(x / i l l1 )
- (or(assoc x l2)
- (progn
- (setq l lst)
- (while(setq i(vl-position x l))
- (setq l1(cons(+ i n(-(length l)))l1)
- l(nthcdr(1+ i)l)))
- (setq l2(cons(cons x(reverse l1))l2))))))lst)
- (reverse l2))
(EVERYPOSITION'(2 5 6.6 5 8.982 7 2.3 7 3.4 6 8.982 5 6 1.6 9 3.4 2 3 7 8.5 8.982 9))
((2 0 16) (5 1 3 11) (6.6 2) (8.982 4 10 20) (7 5 7 18) (2.3 6) (3.4 8 15) (6 9 12) (1.6 13) (9 14 21) (3 17) (8.5 19))
这个返回结果已经包含了去重和频数统计
去重只需要对该函数返回结果进行mapcar'car即可
(mapcar'car(EVERYPOSITION'(2 5 6.6 5 8.982 7 2.3 7 3.4 6 8.982 5 6 1.6 9 3.4 2 3 7 8.5 8.982 9)))
(2 5 6.6 8.982 7 2.3 3.4 6 1.6 9 3 8.5)
频数统计只需要计算各要素的出现位置个数
(mapcar'(lambda(x)(list(car x)(length(cdr x))))(EVERYPOSITION'(2 5 6.6 5 8.982 7 2.3 7 3.4 6 8.982 5 6 1.6 9 3.4 2 3 7 8.5 8.982 9)))
((2 2) (5 3) (6.6 1) (8.982 3) (7 3) (2.3 1) (3.4 2) (6 2) (1.6 1) (9 2) (3 1) (8.5 1))
|