llsheng_73 发表于 2022-7-22 10:52:00

基于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))

hhh454 发表于 2022-7-22 11:49:00

感谢分享,学习了,应该能拓展很多实用的功能

xiaolong1487 发表于 2022-7-22 15:04:00

nthcdr 低版本的没有这个函数

llsheng_73 发表于 2022-7-22 15:42:00


无版本无关,是一个隐藏函数,它还只能在fas里边加载。。。
激活系统隐藏的函数
(出处: 乐筑天下CAD社区)


tryhi-大海的

xsso 发表于 2022-7-25 15:17:00


60阅读权太高了,小弟看不到.......

xiaolong1487 发表于 2022-7-28 16:17:00


学习了,谢谢你了。
页: [1]
查看完整版本: 基于vl-position的扩展-任意元素在表中所有出现位置、表中各元素所有出现位置