本帖最后由 77077 于 2014-8-7 13:47 编辑
结合高手给的思路,编写完成 - (defun c:tt()
- (setq lst1 '(("居住" "1431.05" "8586.30")
- ("居住" "1329.99" "7979.94")
- ("商业" "596.30" "1788.90")
- ("公共设施" "395.54" "791.08")
- ("其他" "365.70" "731.40")
- ("居住" "1311.85" "7871.10")
- ("居住" "1965.39" "11792.34")
- ("公共设施" "507.51" "1015.02")
- ("公共设施" "668.77" "1337.54")
- ("公共设施" "502.95" "1005.90")
- ("公共设施" "574.56" "1149.12")
- ("其他" "660.27" "1320.54")
- )
- lstb '("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他")
- lst2 '())
- ;表分组
- (setq lst2
- (mapcar '(lambda(x y)
- (cons y (vl-remove nil
- (mapcar '(lambda(x)
- (if (member y x) (append x lst2))
- )
- lst1
- )
- )
- )
- )
- lst1 lstb
- )
- )
- ;分组求和
- (mapcar '(lambda (x)
- (if (setq b (cdr x)
- c (rtos (apply '+ (mapcar 'atof (mapcar 'cadr b)))2 2)
- d (rtos (apply '+ (mapcar 'atof (mapcar 'caddr b)))2 2)
- )
- (list (car x) c d)
- (list (car x) "0" "0")
- )
- )
- lst2
- )
- )
测试结果:
命令: tt
(("居住" "6038.28" "36229.68")
("宾馆饭店" "0.00" "0.00")
("商业" "596.30" "1788.90")
("金融" "0.00" "0.00")
("办公" "0.00" "0.00")
("娱乐" "0.00" "0.00")
("厂房" "0.00" "0.00")
("公共设施" "2649.33" "5298.66")
("其他" "1025.97" "2051.94"))
|