找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1830|回复: 9

[每日一码] ;表按索引分组,求高手帮忙优化。。。。。

[复制链接]
发表于 2014-9-27 13:18:58 | 显示全部楼层 |阅读模式

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

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

×
  1. ;表按索引分组,求高手帮忙优化。。。。。
  2. (defun lstgroup(lst / lsta lstb lsti l lst3)
  3. (setq lsta (mapcar 'car lst));找出索引表
  4. (while(setq lstb(cons(car lsta)lstb)
  5.           lsta(vl-remove(car lsta)(cdr lsta))
  6.           )
  7.   );去除重复
  8. (foreach n lstb ;按索引表中各项去查找
  9.    (setq lsti
  10.      (vl-remove nil ;删除nil
  11.        (mapcar
  12.           '(lambda(x)
  13.               (if (member n x) (append x l));用索引去寻找,并添加到临时表l
  14.             )
  15.            lst
  16.         )
  17.       )
  18.     )
  19.    (setq lst3 (cons lsti lst3));组合成新表
  20.    )
  21. lst3
  22. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-9-27 13:42:42 | 显示全部楼层
去把 Xd::list:groupbyindex 看懂吧
  1. (defun lstgroup        (lst / nl ni ii)
  2.   (setq        nl  (list (car lst))
  3.         lst (cdr lst)
  4.   )
  5.   (while lst
  6.     (setq ni  (car lst)
  7.           lst (cdr lst)
  8.     )
  9.     (if        (setq ii (assoc (car ni) nl))
  10.       (setq nl (subst (cons (car ni) (append (cdr ni) (cdr ii))) ii nl))
  11.       (setq nl (cons ni nl))
  12.     )
  13.   )
  14.   nl
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-28 01:12:51 | 显示全部楼层
多谢Free-Lancer大师,不过我只想得到分组后的数据,只是分下组,不改变元素本身.
比如说要得到
(
        (("图层5" 31916.6 5663.55) ("图层5" 39767.8 5621.12) ("图层5" 31916.6 5663.55) ("图层5" 39767.8 5621.12))
        (("图层4" 31916.6 5663.55) ("图层4" 39767.8 5621.12) ("图层4" 31916.6 5663.55))
        (("图层2" 31916.6 5663.55) ("图层2" 39767.8 5621.12) ("图层2" 31916.6 5663.55))
        (("图层1" 39767.8 5621.12)        ("图层1" 31916.6 5663.55) ("图层1" 39767.8 5621.12))
        (("图层3" 39767.8 5621.12) ("图层3" 31916.6 5663.55) ("图层3" 39767.8 5621.12))
        )

点评

这个你应该组建关联表好啊,可以方便以后提取数据 (("图层5" (31916.6 5663.55) (39767.8 5621.12) (31916.6 5663.55) (39767.8 5621.12)) (("图层4" (31916.6 5663.55) (39767.8 5621.12) (31916.6 5663  详情 回复 发表于 2014-9-28 01:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-28 01:24:01 | 显示全部楼层
77077 发表于 2014-9-28 01:12
多谢Free-Lancer大师,不过我只想得到分组后的数据,只是分下组,不改变元素本身.
比如说要得到
(

这个你应该组建关联表好啊,可以方便以后提取数据
(("图层5" (31916.6 5663.55) (39767.8 5621.12) (31916.6 5663.55) (39767.8 5621.12))
        (("图层4" (31916.6 5663.55) (39767.8 5621.12) (31916.6 5663.55))
        (("图层2" (31916.6 5663.55) (39767.8 5621.12) (31916.6 5663.55))
        (("图层1" (39767.8 5621.12)  (31916.6 5663.55) (39767.8 5621.12))
        (("图层3" (39767.8 5621.12) (31916.6 5663.55) (39767.8 5621.12))
        )

这样以后需要数据 (assoc "图层名" 表)就得到了。

点评

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

使用道具 举报

 楼主| 发表于 2014-9-28 01:34:46 | 显示全部楼层
本帖最后由 77077 于 2014-9-28 01:36 编辑

经过测试,Free-Lancer大师的函数好像有问题
(setq ll '(
        ("A5" 31916.6 5545.1)
        ("A5" 39767.8 5689.8)
        ("A4" 31916.6 5545.1)
        ("A4" 39767.8 5689.8)
        ("A2" 31916.6 5545.1)
        ("A2" 39767.8 5689.8)
        ("A2" 31916.6 5689.8)
        ("A1" 39767.8 5545.1)
        ("A5" 31916.6 5689.8)
        ("A5" 39767.8 5545.1)
        ("A4" 31916.6 5689.8)
        ("A3" 39767.8 5545.1)
        ("A3" 31916.6 5689.8)
        ("A3" 39767.8 5545.1)
        ("A1" 31916.6 5689.8)
        ("A1" 39767.8 5545.1)
        ))
测试结果为:
(
("A3" 39767.8 5545.1 31916.6 5689.8 39767.8 5545.1)
("A1" 39767.8 5545.1 31916.6 5689.8 39767.8 5545.1)
("A2" 31916.6 5689.8 39767.8 5689.8 31916.6 5545.1)
("A4" 31916.6 5689.8 39767.8 5689.8 31916.6 5545.1)
("A5" 39767.8 5545.1 31916.6 5689.8 39767.8 5689.8 31916.6 5545.1)
)
我的函数测试结果为:
(
(("A5" 31916.6 5545.1) ("A5" 39767.8 5689.8) ("A5" 31916.6 5689.8) ("A5" 39767.8 5545.1))
(("A4" 31916.6 5545.1) ("A4" 39767.8 5689.8) ("A4" 31916.6 5689.8))
(("A2" 31916.6 5545.1) ("A2" 39767.8 5689.8) ("A2" 31916.6 5689.8))
(("A1" 39767.8 5545.1) ("A1" 31916.6 5689.8) ("A1" 39767.8 5545.1))
(("A3" 39767.8 5545.1) ("A3" 31916.6 5689.8) ("A3" 39767.8 5545.1))
)

点评

应该是你构造的数据不是需要的 每个,你应该改成 ("A5" (31916.6 5545.1))这样的。  详情 回复 发表于 2014-9-28 01:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-28 01:37:40 | 显示全部楼层
newer 发表于 2014-9-28 01:24
这个你应该组建关联表好啊,可以方便以后提取数据
(("图层5" (31916.6 5663.55) (39767.8 5621.12) (31 ...

不错,是个好主意~~

点评

他这个函数,就是帮你分成我说的关联表的。 你把每一个 ("A5" 31916.6 5545.1)这样的,给函数前,都改成 ("A5" (31916.6 5545.1))这样的,然后调用他的函数,看看结果是什么样的。  详情 回复 发表于 2014-9-28 01:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-28 01:46:22 | 显示全部楼层
本帖最后由 newer 于 2014-9-28 01:48 编辑
77077 发表于 2014-9-28 01:34
经过测试,Free-Lancer大师的函数好像有问题
(setq ll '(
        ("A5" 31916.6 5545.1)

应该是你构造的数据不是需要的

  1. (setq ll '(
  2.         ("A5" 31916.6 5545.1)
  3.         ("A5" 39767.8 5689.8)
  4.         ("A4" 31916.6 5545.1)
  5.         ("A4" 39767.8 5689.8)
  6.         ("A2" 31916.6 5545.1)
  7.         ("A2" 39767.8 5689.8)
  8.         ("A2" 31916.6 5689.8)
  9.         ("A1" 39767.8 5545.1)
  10.         ("A5" 31916.6 5689.8)
  11.         ("A5" 39767.8 5545.1)
  12.         ("A4" 31916.6 5689.8)
  13.         ("A3" 39767.8 5545.1)
  14.         ("A3" 31916.6 5689.8)
  15.         ("A3" 39767.8 5545.1)
  16.         ("A1" 31916.6 5689.8)
  17.         ("A1" 39767.8 5545.1)
  18.         ))


构造前,每个,你应该改成  ("A5" (31916.6 5545.1))这样的。这样符合分组函数的需要,也是比较符合常规的。 表数据就是表为单元,不要把他们拆散。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-28 01:50:22 | 显示全部楼层
77077 发表于 2014-9-28 01:37
不错,是个好主意~~

他这个函数,就是帮你分成我说的关联表的。

你把每一个  ("A5" 31916.6 5545.1)这样的,给函数前,都改成  ("A5" (31916.6 5545.1))这样的,然后调用他的函数,看看结果是什么样的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-28 02:12:37 | 显示全部楼层
本帖最后由 st788796 于 2014-9-28 02:15 编辑

索引都一样了还要每个子表干什么,索引就是索引,分组后保留一个即可
你的数据用 ("A1" (1232.12 2243.00)) ... 这样构造再使用 Free-lancer 函数试试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 21:54 , Processed in 0.508354 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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