基于vl-position的扩展-任意元素在表中所有出现位置、表中各元素所有出现位置
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))
感谢分享,学习了,应该能拓展很多实用的功能 nthcdr 低版本的没有这个函数
无版本无关,是一个隐藏函数,它还只能在fas里边加载。。。
激活系统隐藏的函数
(出处: 乐筑天下CAD社区)
tryhi-大海的
60阅读权太高了,小弟看不到.......
学习了,谢谢你了。
页:
[1]