找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2027|回复: 4

[LISP函数]:将表中相同的元素分组

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-2 01:34:49 | 显示全部楼层 |阅读模式

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

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

×

  1. (defun xdl-lst-getdups (lst / n nl same)
  2.   (while lst
  3.     (setq n (car lst))
  4.     (if        (not nl)
  5.       (setq nl (list (list n)))
  6.       (if (setq same (assoc n nl))
  7.         (setq nl (subst (append (list n) same) same nl))
  8.         (setq nl (append (list (list n)) nl))
  9.       )
  10.     )
  11.     (setq lst (cdr lst))
  12.   )
  13.   (reverse nl)
  14. )

转换为元素、数量格式

  1. (defun xdl-lst-getdup (lst)
  2.   (mapcar '(lambda (x) (cons (caar x) (length x)))
  3.           (xdl-lst-getdups lst)
  4.   )
  5. )

;;测试
_$ (xdl-lst-getdups '(1 2 3 4 1 1 1 1 1 1 5 5 5 55 5  6 7 8))
((1 1 1 1 1 1 1) (2) (3) (4) (5 5 5 5) (55) (6) (7) (8))
_$ (xdl-lst-getdups '(1 2 3 4 (1) (1) 1 1 1 1 5 5 5 55 5  6 7 8))
((1 1 1 1 1) (2) (3) (4) ((1) (1)) (5 5 5 5) (55) (6) (7) (8))
_$ (xdl-lst-getdup (xdl-lst-getdups '(1 2 3 4 (1) (1) 1 1 1 1 5 5 5 55 5  6 7 8)))
(((1 1 1 1 1) . 1) ((2) . 1) ((3) . 1) ((4) . 1) (((1) (1)) . 1) ((5 5 5 5) . 1) ((55) . 1) ((6) . 1) ((7) . 1) ((8) . 1))
_$ (xdl-lst-getdup (xdl-lst-getdups '(1 2 3 4 (1) (1) 1 1 1 1 5 5 5 55 5  6 7 8)))
((1 . 1) (2 . 1) (3 . 1) (4 . 1) ((1) . 1) (5 . 1) (55 . 1) (6 . 1) (7 . 1) (8 . 1))
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2005-10-3 13:06:29 | 显示全部楼层

  1. (defun xdl-lst-getdups (lst / n nl same)
  2.   (while lst
  3.     (if        (setq same (assoc (setq n (car lst)) nl))
  4.       (setq nl (subst (append (list n) same) same nl))
  5.       (setq nl (cons (list n) nl))
  6.     )
  7.     (setq lst (cdr lst))
  8.   )
  9.   (vl-remove-if '(lambda (x) (= (length x) 1)) (reverse nl))
  10. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-10-3 18:56:08 | 显示全部楼层

  1. ;;;统计个数.  
  2. ;;;'("A""B""C""A""B""A")  --> '(("A" . 3)("B" . 2)("C" . 1"))
  3. (defun test(lst / l new no)               
  4. (foreach no lst
  5.    (if(setq l(assoc no new))
  6.       (setq new(subst (cons no(1+(cdr l)))l new))
  7.       (setq new(cons(cons no 1)new))
  8.     )
  9. )new
  10. )

有重复的:
(mapcar 'car (vl-remove-if '(lambda(x)(= (cdr x)1)) (test lst)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2014-3-20 23:11:20 | 显示全部楼层
源码是好东西
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 11个

财富等级: 恭喜发财

发表于 2014-10-21 23:18:48 | 显示全部楼层
源码不错,写的好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 16:42 , Processed in 0.266843 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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