changyiran 发表于 2013-11-22 12:42:24

如何将表中连续的相同元素只保留一个

如题,注意是连续的相同元素,如果元素相同但是他们在表中的顺序不是连续的话不做任何处理,例如'(1 1 2 1 3 3 4 3 5)运行函数后变为'(1 2 1 34 3 5),并且表中元素并不局限于数字,有可能是表。各位大神发挥想象力看如何解决吧!

ll_j 发表于 2013-11-22 13:16:29

(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)
)

changyiran 发表于 2013-11-22 13:29:49

ll_j 发表于 2013-11-22 13:16 static/image/common/back.gif


牛逼啊,还有没代码更为简练些的呢?或者是运行效率更高的代码?

xujinhua 发表于 2013-11-24 08:53:12

又学到东西了...谢谢

nzl1116 发表于 2013-11-24 09:12:18

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

changyiran 发表于 2013-11-24 18:02:19

nzl1116 发表于 2013-11-24 09:12 static/image/common/back.gif


此代码确实简洁,只不过效率劣于上个代码!

llsheng_73 发表于 2013-11-28 16:50:12

本帖最后由 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))
但对代码明显复杂了好多,对于表不大相同项也不多的情况下估计还不如上边一个

Gu_xl 发表于 2013-11-28 18:02:59

(Defun f(l)(if l (if (/= (car l) (cadr l))(cons (car l) (f (cdr l)) ) (f (cdr l)))))
页: [1]
查看完整版本: 如何将表中连续的相同元素只保留一个