求帮忙修改算法,提出更快更便捷的算法.
- ;;; 测试命令:
- ;;; (tablist:group '(("a" 1 1) ("b" 1 1) ("c" 1 1) ("b" 2 1) ("b" 3 1) ("a" 2 2) ("a" 3 3) ("b" 4 2) ("c" 2 2) ("c" 3 1)) 1)
- ;;; ==>((("a" 1 1) ("a" 2 2) ("a" 3 3)) (("b" 1 1) ("b" 2 1) ("b" 3 1) ("b" 4 2)) (("c" 1 1) ("c" 2 2) ("c" 3 1)))
- (defun tablist:group (lst fuzz / k l ll)
- (setq k (caar lst)) ; 设定关键词
- (while lst ; 循环取值
- (setq l (vl-remove-if-not '(lambda (x)
- (equal (car x) k fuzz)
- ) lst
- ) ; 以关键词查找出对应的元素表l
- l (list l) ; 组合成一个小组
- ll (append l ll) ; 小组添加到输出表
- )
- (setq lst (vl-remove-if '(lambda (x)
- (equal (car x) k fuzz)
- ) lst
- ) ; 剔除后形成新表lst
- k (caar lst) ; 设定新的关键词
- )
- ) ; while循环结束
- (reverse ll) ; 反串
- )
- ;;; 测试命令:
- ;;; (tablist:group1 '(("a" 1 1) ("b" 1 1) ("c" 1 1) ("b" 2 1) ("b" 3 1) ("a" 2 2) ("a" 3 3) ("b" 4 2) ("c" 2 2) ("c" 3 1)) 1)
- ;;; ==>(("a" (1 1) (2 2) (3 3)) ("b" (1 1) (2 1) (3 1) (4 2)) ("c" (1 1) (2 2) (3 1)))
- (defun tablist:group1 (lst fuzz / k l ll)
- (setq k (caar lst)) ; 设定关键词
- (while lst ; 循环取值
- (setq l (vl-remove-if-not '(lambda (x)
- (equal (car x) k fuzz)
- ) lst
- ) ; 以关键词查找出对应的元素表l
- l (mapcar 'cdr l) ; 分别剔除首项
- l (list (cons k l)) ; 组合成一个小组
- ll (append l ll) ; 小组添加到输出表
- )
- (setq lst (vl-remove-if '(lambda (x)
- (equal (car x) k fuzz)
- ) lst
- ) ; 剔除后形成新表lst
- k (caar lst) ; 设定新的关键词
- )
- ) ; while循环结束
- (reverse ll) ; 反串
- )
|