lisp爱好者 发表于 2013-9-4 11:10:58

如何把表lst内数据汇总

本帖最后由 lisp爱好者 于 2013-9-4 11:12 编辑

请教G版、Z版、不死猫、高飞、langjs ......等等高手,如何把表lst汇总成下面的格式?
(setq lst '(( "A-1" "60" "50")("A-2" "60" "55")("A-3" "60" "50")( "A-4" "60" "50")("A-5" "60" "55")
   ("A-6" "60" "50")( "A-7" "60" "50")("A-8" "60" "45")("A-9" "60" "60")("A-10" "60" "60")))
我要的格式是下面这样的,小生这厢有礼了,望不吝赐教,拜谢。

'(( "A-1、A-3、A-4、A-6、A-7" "60" "50")("A-2、A-5" "60" "55")("A-8" "60" "45")("A-9、A-10" "60" "60"))

lisp爱好者 发表于 2013-9-4 11:30:45

还望大家帮忙下,谢谢,归类方式是判断小表中后两者的数据均相同时把小表中第一个数据合并
例:("A-3" "60" "50")( "A-4" "60" "50")
      判断"60" 和 "50"都相等,那么就把"A-4"加到"A-3"表内,最终编程( "A-3、A-4" "60" "50")

lisp爱好者 发表于 2013-9-4 11:33:40

如果就两个表好处理,分别提出来比较,通过的话就合并修改,但是小表数量多了,找不到好方法了,烦请大侠出手相助

Gu_xl 发表于 2013-9-4 11:44:56

(defun f (l / a b)
(setq a (caar l)
      b (cdar l)
      l (cdr l)
      )
(setq l (vl-remove-if
            (function (lambda (x)
                        (if (equal b (cdr x))
                        (setq a (strcat a "、" (car x)))
                        )
                        )
                      )
            l
            )
      )
(if l
    (cons (cons a b) (f l))
    (list (cons a b))
    )
)
;;测试
(f lst)
;;返回
(("A-1、A-3、A-4、A-6、A-7" "60" "50") ("A-2、A-5" "60" "55") ("A-8" "60" "45") ("A-9、A-10" "60" "60"))

自贡黄明儒 发表于 2013-9-4 11:47:35

lisp爱好者 发表于 2013-9-4 11:30 static/image/common/back.gif
还望大家帮忙下,谢谢,归类方式是判断小表中后两者的数据均相同时把小表中第一个数据合并
例:("A-3" "60 ...

杀鸡焉用牛刀
(setq a        '("A-3" "60" "50") b '("A-4" "60" "50"))
(defun w2 (a b)
(if (VL-EVERY '= (cdr a) (cdr b))
    (append (list (car a) (car b)) (cdr a))
)
)

lisp爱好者 发表于 2013-9-4 14:27:24

自贡黄明儒 发表于 2013-9-4 11:47 static/image/common/back.gif
杀鸡焉用牛刀

谢谢黄兄,这样的返回正确(setq a '("A-3" "60" "50") b '("A-4" "60" "50"))
(defun w2 (a b)
(if (VL-EVERY '= (cdr a) (cdr b))
    (append (list (strcat (car a) "、" (car b))) (cdr a))
)
)
测试:(w2 a b)
返回:("A-3、A-4" "60" "50")

lisp爱好者 发表于 2013-9-4 14:28:28

Gu_xl 发表于 2013-9-4 11:44 static/image/common/back.gif


仰视 G版,多谢帮助
页: [1]
查看完整版本: 如何把表lst内数据汇总