自定义函数 改进vl-position函数对重复元素的首位置判断为全位置判断
给朋友们分享个自定义函数,列出重复元素在列表中的所有位置(对vl-position函数的适当改进),请大家测试并优化下,谢谢!;自定义函数名称 ygs-vl-position 作者ygs-羊羊羊
;列出表L中某个重复要素en的所有位置列表,改进vl-position函数对重复元素的首位置判断为全位置判断
;参数:L 含有重复元素的列表,en 列表中的某元素项(可能为重复元素)
;返回值:位置数字或位置的列表(重复元素en则返回位置数字列表,若en不是L的成员,则返回nil)
;测试 (setq l'( 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))
; (ygs-vl-position (setq en 9) L)
(defun ygs-vl-position(L en / CS PDZ WZB ZCS)
(setq zcs 0)
(while(setq pdz(vl-position en L))
(setq wzb(cons(+ zcs pdz)wzb))
(repeat(setq cs(1+ pdz))
(setq l(cdr l))
)
(setq zcs(+ cs zcs))
)
(reverse wzb)
)
基于vl-position的扩展-任意元素在表中所有出现位置、表中各元素所有出现位置
(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 ygs-dup-en-pos (en L / WZB ZCS)
(setq zcs 0)
(mapcar '(lambda (x)
(setq zcs (1+ zcs))
(if (= x en)
(setq wzb (cons zcs wzb))
)
)
l
)
(reverse wzb)
)
谢谢你的优化看起来清爽多了!
好的谢谢!
这个nthcdr 会提高效率 但不是所有电脑的CAD都有 自己用可以在通用性上还是差一些
很多隐藏函数效率相当高,多加载一个fas是值得的
页:
[1]