明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2391|回复: 11

[已解答] 表数据分组统计的问题~

[复制链接]
发表于 2014-8-6 16:26:00 | 显示全部楼层 |阅读模式
假如有一建筑物数据组
;(建筑类型 基底面积 建筑面积)
(setq lst '(
("居住" "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")
))
如何将他们按照建筑类型进行分组,并统计出总基底面积和总建筑面积?
下面每项都要有数值,如果没有此类建筑,总和为0?
(setq lstb '("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他"))

最终统计出来的数据表可能是是((居住  总基底面积 总建筑面积) (宾馆饭店  总基底面积 总建筑面积) (商业  总基底面积 总建筑面积) ....)这种格式.
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-8-6 16:47:59 | 显示全部楼层
本帖最后由 77077 于 2014-8-7 13:47 编辑

结合高手给的思路,编写完成
  1. (defun c:tt()
  2. (setq lst1 '(("居住" "1431.05" "8586.30")
  3.                ("居住" "1329.99" "7979.94")
  4.                ("商业" "596.30" "1788.90")
  5.                ("公共设施" "395.54" "791.08")
  6.                ("其他" "365.70" "731.40")
  7.                ("居住" "1311.85" "7871.10")
  8.                ("居住" "1965.39" "11792.34")
  9.                ("公共设施" "507.51" "1015.02")
  10.                ("公共设施" "668.77" "1337.54")
  11.                ("公共设施" "502.95" "1005.90")
  12.                ("公共设施" "574.56" "1149.12")
  13.                ("其他" "660.27" "1320.54")
  14.               )
  15.       lstb '("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他")
  16.       lst2 '())
  17. ;表分组
  18. (setq lst2
  19.    (mapcar '(lambda(x y)
  20.      (cons y (vl-remove nil
  21.          (mapcar '(lambda(x)
  22.                     (if (member y x) (append x lst2))
  23.                  )
  24.             lst1
  25.             )
  26.             )
  27.         )
  28.     )
  29.      lst1 lstb
  30.      )
  31.   )
  32. ;分组求和
  33. (mapcar '(lambda (x)
  34.             (if (setq b (cdr x)
  35.                      c (rtos (apply '+ (mapcar 'atof (mapcar 'cadr b)))2 2)
  36.                      d (rtos (apply '+ (mapcar 'atof (mapcar 'caddr b)))2 2)
  37.                      )
  38.               (list (car x) c d)
  39.             (list (car x) "0" "0")
  40.             )
  41.           )
  42.          lst2
  43.    )
  44. )
测试结果:
命令: 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"))
发表于 2014-8-6 17:16:21 | 显示全部楼层
本帖最后由 xyp1964 于 2014-8-6 17:20 编辑

(("公共设施" 2649.33 5298.66) ("居住" 6038.28 36229.7) ("其他" 1025.97 2051.94) ("商业" 596.3 1788.9))
  1. (setq lst  '(("居住" "1431.05" "8586.30")             ("居住" "1329.99" "7979.94")
  2.              ("商业" "596.30" "1788.90")
  3.              ("公共设施" "395.54" "791.08")
  4.              ("其他" "365.70" "731.40")
  5.              ("居住" "1311.85" "7871.10")
  6.              ("居住" "1965.39" "11792.34")
  7.              ("公共设施" "507.51" "1015.02")
  8.              ("公共设施" "668.77" "1337.54")
  9.              ("公共设施" "502.95" "1005.90")
  10.              ("公共设施" "574.56" "1149.12")
  11.              ("其他" "660.27" "1320.54")
  12.             )
  13.       lst (xyp-count1(vl-sort lst'(lambda(x y)(<(car x)(car y)))))
  14.       lst (mapcar '(lambda (x)
  15.                       (setq b(cdr x)
  16.                             c(apply '+(mapcar'distof(mapcar'car b)))
  17.                             d(apply '+(mapcar'distof(mapcar'cadr b)))
  18.                       )
  19.                       (list(car x) c d)
  20.                     )
  21.                    lst
  22.            )
  23. )
 楼主| 发表于 2014-8-6 17:18:48 | 显示全部楼层
本帖最后由 77077 于 2014-8-6 17:20 编辑

没错,就是要这样的,不过院长的好像少了些东西,例如:
("娱乐" "0" "0")

最好能按 lstb里面的顺序排列,没有的就0表示~

点评

给的lst表就很乱  发表于 2014-8-6 17:22
没看到有娱乐节目……  发表于 2014-8-6 17:21
 楼主| 发表于 2014-8-6 17:29:48 | 显示全部楼层
院长写的(apply '+ (mapcar 'distof (mapcar 'cadr b)))
我写的(apply '+ (mapcar '(lambda(x) (atof (cadr x))) lst))
晕了晕了~
发表于 2014-8-6 21:05:20 | 显示全部楼层
本帖最后由 wowan1314 于 2014-8-6 23:27 编辑

这个是个体力活!

喜欢这样的代码,看着很漂亮!


(("居住" 6038.28 36229.7) ("宾馆饭店" "0" "0") ("商业" 596.3 1788.9) ("金融"
"0" "0") ("办公" "0" "0") ("娱乐" "0" "0") ("厂房" "0" "0") ("公共设施" 2649.33
5298.66) ("其他" 1025.97 2051.94))
  1. (defun t11 (l ll)
  2.     (mapcar
  3.         '(lambda(a b)
  4.             (if (= a (car b))
  5.                 b
  6.                 (cons a
  7.                     (eval
  8.                         (cons 'mapcar
  9.                             (cons ''+
  10.                                 (mapcar
  11.                                     '(lambda(x)
  12.                                         (cons 'list x)
  13.                                     )
  14.                                     b
  15.                                 )
  16.                             )
  17.                         )
  18.                     )
  19.                 )
  20.             )
  21.         )
  22.         ll
  23.         (mapcar
  24.             '(lambda(x)
  25.                 (if (assoc x l)
  26.                     (mapcar
  27.                         '(lambda(y)
  28.                             (if (= x (car y))
  29.                                 (mapcar 'atof (cdr y))
  30.                                 '(0 0)
  31.                             )
  32.                         )
  33.                         l
  34.                     )
  35.                     (list x "0" "0")
  36.                 )
  37.             )
  38.             ll
  39.         )
  40.     )
  41. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-8-6 21:40:40 | 显示全部楼层
hoho~~~
我估计也是个体力活,这么多mapcar。
明天测试下看看。
 楼主| 发表于 2014-8-6 21:49:14 | 显示全部楼层
可不可以换种思路解题
setq将("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他")中的每一个设置成空数据,如:(setq lst1 '("居住"  “0” “0”) lst2 '("宾馆饭店"  “0” “0”)...)
然后顺序读取 lst 中的每一项,分别取出(cadr)(caddr)加到对应的表中,最后将表合并起来组成最终的表~

坏处是借用一大堆的lst1...lstn,可能会影响效率~
发表于 2014-8-6 23:22:02 | 显示全部楼层
本帖最后由 xyp1964 于 2014-8-6 23:23 编辑
77077 发表于 2014-8-6 21:49
可不可以换种思路解题
setq将("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他" ...

结果:
(("居住" 6038.28 36229.7)
  ("宾馆饭店" 0 0)
  ("商业" 596.3 1788.9)
  ("金融" 0 0)
  ("办公" 0 0)
  ("娱乐" 0 0)
  ("厂房" 0 0)
  ("公共设施" 2649.33 5298.66)
  ("其他" 1025.97 2051.94)
)
  1. (defun c:tt ()
  2.   (setq lst1 '(("居住" "1431.05" "8586.30")
  3.                ("居住" "1329.99" "7979.94")
  4.                ("商业" "596.30" "1788.90")
  5.                ("公共设施" "395.54" "791.08")
  6.                ("其他" "365.70" "731.40")
  7.                ("居住" "1311.85" "7871.10")
  8.                ("居住" "1965.39" "11792.34")
  9.                ("公共设施" "507.51" "1015.02")
  10.                ("公共设施" "668.77" "1337.54")
  11.                ("公共设施" "502.95" "1005.90")
  12.                ("公共设施" "574.56" "1149.12")
  13.                ("其他" "660.27" "1320.54")
  14.               )
  15.         lst2 '("居住" "宾馆饭店" "商业" "金融" "办公" "娱乐" "厂房" "公共设施" "其他")
  16.         lst3 (mapcar '(lambda (x) (list x)) lst2)
  17.   )
  18.   (foreach a lst1
  19.     (setq name (car a)
  20.           nn (- (length lst2) (length (member name lst2)))
  21.           i -1
  22.           lst3 (mapcar '(lambda (x)
  23.                           (setq i (1+ i))
  24.                           (if (= i nn)(cons (cdr a) x)x)
  25.                         )
  26.                        lst3
  27.                )
  28.     )
  29.   )
  30.   (mapcar '(lambda (x)
  31.              (setq b (cdr x)
  32.                    c (apply '+ (mapcar 'distof (mapcar 'car b)))
  33.                    d (apply '+ (mapcar 'distof (mapcar 'cadr b)))
  34.              )
  35.              (list (car x) c d)
  36.            )
  37.           (mapcar 'reverse lst3)
  38.   )
  39. )
发表于 2014-8-6 23:39:30 | 显示全部楼层
本帖最后由 wowan1314 于 2014-8-6 23:43 编辑

这个院长的!

还是觉的mapcar 叠一起好看! 哈哈

本帖子中包含更多资源

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

x

点评

wowan1314, 这么好的编辑器,分享下啊,呵呵  发表于 2014-8-7 08:14
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-24 06:23 , Processed in 0.202315 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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