如何将表中连续的相同元素只保留一个
如题,注意是连续的相同元素,如果元素相同但是他们在表中的顺序不是连续的话不做任何处理,例如'(1 1 2 1 3 3 4 3 5)运行函数后变为'(1 2 1 34 3 5),并且表中元素并不局限于数字,有可能是表。各位大神发挥想象力看如何解决吧!(defun tt (lst / aa ll)
(setq ll (list (car lst)))
(while (cdr lst)
(if (not (equal (setq aa (car lst))
(car (setq lst (cdr lst)))
)
)
(setq ll (cons (car lst) ll))
)
)
(reverse ll)
) ll_j 发表于 2013-11-22 13:16 static/image/common/back.gif
牛逼啊,还有没代码更为简练些的呢?或者是运行效率更高的代码? 又学到东西了...谢谢 changyiran 发表于 2013-11-22 13:29 static/image/common/back.gif
牛逼啊,还有没代码更为简练些的呢?或者是运行效率更高的代码?
(defun func (lst / y)
(if (= (car Lst) 0) (setq y 1) (setq y 0))
(vl-remove-if '(lambda (x) (or (= x y) (not (setq y x)))) lst)
) nzl1116 发表于 2013-11-24 09:12 static/image/common/back.gif
此代码确实简洁,只不过效率劣于上个代码! 本帖最后由 llsheng_73 于 2013-11-28 17:46 编辑
(defun tt(lst / a ll)
(while lst(setq a(car lst)lst(vl-remove a lst)ll(cons a ll)))
(reverse ll))
这个去除所有重的,下边去除连续相同的
(defun tt(lst / a ll)
(while lst(setq a(car lst)lst(cdr lst)ll(if(not(equal(car ll)a))(cons a ll)ll)))
(reverse ll))
简单是简单了但表有多长得处理多少次,对于表很大,连续项也比较长的话下边这个效率会高些
(defun tt(lst / a ll l2)
(setq ll lst)
(while ll(setq a(car ll)ll(vl-remove a ll)l2(cons a l2)))
(setq l2(reverse l2))
(while lst(setq a(car lst)
l2(if(member a l2)(cdr l2)l2)
lst(member (car l2)lst)
ll(if(not(equal(car ll)a))(cons a ll)ll)))
(reverse ll))
但对代码明显复杂了好多,对于表不大相同项也不多的情况下估计还不如上边一个 (Defun f(l)(if l (if (/= (car l) (cadr l))(cons (car l) (f (cdr l)) ) (f (cdr l)))))
页:
[1]