找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 657|回复: 3

[求助] [求助]:删除表中重复的元素用什么函数

[复制链接]
发表于 2007-6-15 10:30:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
删除表中重复的元素用什么函数?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-6-15 11:28:59 | 显示全部楼层
美女。。。一定没有搜过论坛里的贴子吧。
[php]
;;;删除列表中的相同元素(保留一个)并返回新表
(defun LstDelSame (lst / x nl)
  (foreach x lst
    (if        (not (member x nl))
      (setq nl (cons x nl))
    )
  )
  (reverse nl)
)


;;;N位開始,M 長度的子表
(defun LI_SubList ( Lst Start len / _len n m _Lst)
(if (minusp len)
    (setq len (1+(length lst)))
)

(setq
    _len (length Lst)
    n (min (- Start 1) _len)    ; Starting Index
    m (min (+ n len) _len)        ; Ending Index
    _Lst '()
)

(while (< n m)
    (setq
        _Lst (cons (nth n Lst) _Lst)
        n (1+ n)
    )
)
(reverse _Lst)
)

;;;统计表中相同元素的个数
(defun lstsameitmnum (lst / a len x return)
(while lst
  (setq a (car lst))
  (setq len (length lst))
  (setq lst(vl-remove-if  '(lambda(x)(= a x)) lst))
  ;;第一个是(- len(length lst))个
  (setq return (cons (list a (- len(length lst))) return))
)
return
)

;;;两表的并集
(defun LSTUNION        (Lst1 Lst2 / Lst tmp)
  (append Lst1 lst2)
)

;;;两表的交集
(defun LSTINTER        (Lst1 Lst2 / Lst tmp lst11 lst22)
  (foreach tmp Lst2
    (if        (member tmp Lst1)
      (setq Lst22 (cons tmp Lst22))
    )
  )
  (foreach tmp Lst1
    (if        (member tmp Lst2)
      (setq Lst11 (cons tmp Lst11))
    )
  )
  (setq        Lst (append (reverse Lst11) (reverse Lst22))
        lst (LstDelSame lst)
  )
  Lst
)

;;;两表的差集
(defun LSTDIFF (Lst1 Lst2 / Lst tmp lst11 lst22)
  (foreach tmp Lst2
    (if        (not (member tmp Lst1))
      (setq Lst22 (cons tmp Lst22))
    )
  )
  (foreach tmp Lst1
    (if        (not (member tmp Lst2))
      (setq Lst11 (cons tmp Lst11))
    )
  )
  (setq        Lst (append (reverse Lst11) (reverse Lst22))
        lst (LstDelSame lst)
  )
  Lst
)


;;;listremoveatom去除表delatom中指定的元素lstin
(defun listremoveatom (delatom lstin)
  (apply
    'append
    (subst
      nil
      (list delatom)
      (mapcar
    'list
    lstin
      )
    )
  )
)

(defun LI_RemLst( itm lst / nlst elem len )
(setq nlst '())
(foreach elem lst
    (if (not (equal elem itm))
        (setq nlst (append nlst (list elem)))
    )
)
nlst
)

;;;將表的第N項移去
(defun LI_DelLst( Idx Lst / nlst cnt elem )
(setq
    nlst '()
    cnt 1
)
(foreach elem lst
    (if (/= cnt Idx)
        (setq nlst (cons elem nlst))
    )
    (setq cnt (1+ cnt))
)
(reverse nlst)
)

;;;及在表的第n項位置增加一元素

(defun LI_AddList (Lst Pos Val / Lst1 Lst2 cnt nverts )
(setq
    cnt 0
    Lst1 '()
    nverts (length Lst)
)

(repeat Pos
    (setq
        Lst1 (cons (nth cnt Lst) Lst1)
        cnt (1+ cnt)
    )
)

(setq
    Lst1 (cons Val Lst1)
    Lst1 (reverse Lst1)
    cnt Pos
)

(if (> nverts Pos)
(progn
    (setq Lst2 '())
    (repeat (- nverts Pos)
        (setq
            Lst2 (cons (nth cnt Lst) Lst2)
            cnt (1+ cnt)
        )
    )
    (setq
        Lst2 (reverse Lst2)
        Lst1 (append Lst1 Lst2)
    )
))
Lst1
)


;;;;表排序
;;;;(55 11 33 44 22 66) 变成(11 22 33 44 55 66)

;;;將表的第N項移去
(defun LI_DelLst (Idx Lst / nlst cnt elem)
  (setq
    nlst '()
    cnt         1
  )
  (foreach elem        lst
    (if        (/= cnt Idx)
      (setq nlst (cons elem nlst))
    )
    (setq cnt (1+ cnt))
  )
  (reverse nlst)
)

(defun sortlist (lis / len k abc nn len_nn plis)
  (setq len (length lis))
  (setq k 1)
  (while (<= k len)
    (setq abc (eval (append '(max) lis)))
    (setq nn 1)
    (setq len_nn (length lis))
    (while (<= nn len_nn)
      (if (= (nth (1- nn) lis) abc)
        (progn
          (setq lis (LI_DelLst nn lis))
          (setq plis (cons abc plis))
        )
      )
      (setq nn (1+ nn))
    )
    (setq k (1+ k))
  )
  (reverse plis)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-6-17 07:46:29 | 显示全部楼层
试试这个: (acet-list-remove-duplicates plist tol)
其中: plist 表,tol 精度
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2007-6-19 22:30:36 | 显示全部楼层
一般来说用的都是有序表~
再用这个方法来删相同元素就太慢了~

基本算法是:
如果表是有必要排序的
就先排序再用foreach来消重~

就算是不必要排序的表
如果有很多的要消重也要先排序再用foreach来消重
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 09:42 , Processed in 0.340162 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表