找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2662|回复: 16

[研讨] 表里面对应位置的元素组建个新表,怎么写更高效?

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-11-15 18:42:09 | 显示全部楼层 |阅读模式

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

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

×
(("1-1" "1-2" "1-3")("2-1" "2-2" "2-3")....("3-1" "3-2" "3-3"))

----->
(("1-1" "2-1" "3-1")("1-2" "2-2" "3-2")...("1-3" "2-3" "3-3"))

表长不固定,所以别用(list (mapcar 'car ..) (mapcar 'cadr ..)(mapcar 'caddr ..))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-15 19:02:13 | 显示全部楼层
本帖最后由 st788796 于 2013-11-15 19:08 编辑

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-11-15 19:12:07 | 显示全部楼层
命令: (setq a '(("1-1" "1-2" "1-3")("2-1" "2-2" "2-3")("3-1" "3-2" "3-3")))
(("1-1" "1-2" "1-3") ("2-1" "2-2" "2-3") ("3-1" "3-2" "3-3"))

命令: (apply 'mapcar (cons 'list a))
(("1-1" "2-1" "3-1") ("1-2" "2-2" "3-2") ("1-3" "2-3" "3-3"))

点评

更进一步,若子表不等长,看谁能给出最简洁代码? (setq a '(("1-1" "1-2" "1-3")("2-1" "2-2" )("3-1" ))) => (("1-1" "2-1" "3-1") (" 1-2" "2-2")("1-3"))  详情 回复 发表于 2013-11-15 21:42

评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-11-15 21:30:54 | 显示全部楼层
我现在是很不讨喜的一个人,不过还是要说一点的。
这个问题以前论坛里出现过,但有些歧义的东西到最终也没有讨论清楚,比如一个表分别有4、3、4个子项,那么,新表的第四项应该是“(a14 nil a34)”,还是“(a14 a34)”呢?
使用Lispboy的方法应该是正常的方法,但在子表长度不同时只能取小值,所以和本题有些出入(其实够用了),不好说是正解。

点评

虽然说得有点偏题,但是你考虑问题 挺严谨,这个问题说得好,可以把这个先解决了 在弄个新的题目 建个帖子  详情 回复 发表于 2013-11-16 08:17
让表的第一个子表长度最长就解决了。  详情 回复 发表于 2013-11-15 22:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-15 21:42:18 来自手机 | 显示全部楼层
Lispboy 发表于 2013-11-15 19:12
命令: (setq a '(("1-1" "1-2" "1-3")("2-1" "2-2" "2-3")("3-1" "3-2" "3-3")))
(("1-1" "1-2" "1-3") (" ...

更进一步,若子表不等长,看谁能给出最简洁代码?
(setq a '(("1-1" "1-2" "1-3")("2-1" "2-2" )("3-1" )))
=>
(("1-1" "2-1" "3-1") (" 1-2" "2-2")("1-3"))

点评

我写的那个,要求在处理数据的时候就让表长度都一样,CELL空的用空格或者NIL填补。 你说的这个,如果表不等长,那么先求出最长的子表长度,然后把每个子表都填补下。  详情 回复 发表于 2013-11-15 22:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-11-15 22:02:33 | 显示全部楼层
本帖最后由 Lispboy 于 2013-11-15 22:05 编辑
ll_j 发表于 2013-11-15 21:30
我现在是很不讨喜的一个人,不过还是要说一点的。
这个问题以前论坛里出现过,但有些歧义的东西到最终也没 ...

求出子表最大长度,然后把每个子表都填补下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-11-15 22:06:54 | 显示全部楼层
牢固 发表于 2013-11-15 21:42
更进一步,若子表不等长,看谁能给出最简洁代码?
(setq a '(("1-1" "1-2" "1-3")("2-1" "2-2" )("3-1"  ...

我写的那个,要求在处理数据的时候就让表长度都一样,CELL空的用空格或者NIL填补。

你说的这个,如果表不等长,那么先求出最长的子表长度,然后把每个子表都填补下。

点评

实现结果自然很容易,要的是看谁给出的代码最简洁,大家权当练练手吧! 我先给个递归法的! (defun f(l) (if l (cons (mapcar 'car l) (f (vl-remove nil (mapcar 'cdr l)))) ) )  详情 回复 发表于 2013-11-15 22:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-15 22:26:56 来自手机 | 显示全部楼层
Lispboy 发表于 2013-11-15 22:06
我写的那个,要求在处理数据的时候就让表长度都一样,CELL空的用空格或者NIL填补。

你说的这个,如果 ...

实现结果自然很容易,要的是看谁给出的代码最简洁,大家权当练练手吧!
我先给个递归法的!
(defun f(l)
   (if l
     (cons (mapcar 'car l) (f (vl-remove nil (mapcar 'cdr l))))
      )
    )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-15 22:32:33 | 显示全部楼层
不一定最简捷
  1. (defun f (lst / nl)
  2.   (setq lst (vl-sort lst '(lambda (l1 l2) (> (length l1) (length l2)))))
  3.   (while lst
  4.     (setq nl  (cons (apply 'mapcar (cons 'list lst)) nl)
  5.           lst (cdr lst)
  6.     )
  7.   )
  8.   (reverse nl)
  9. )

点评

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-15 22:45:38 来自手机 | 显示全部楼层
st788796 发表于 2013-11-15 22:32
不一定最简捷

函数结果不对吧!

点评

G版,去试试 http://bbs.xdcad.net/thread-671642-1-1.html  详情 回复 发表于 2013-11-15 23:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-11-15 23:18:47 | 显示全部楼层
本帖最后由 Lispboy 于 2013-11-15 23:20 编辑
牢固 发表于 2013-11-15 22:45
函数结果不对吧!

G版,去试试,迭代的。

http://bbs.xdcad.net/thread-671642-1-1.html


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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-11-16 06:08:16 来自手机 | 显示全部楼层
(defun ff (lst /  nl l )
  (if  ( apply '=  (mapcar 'length lst))
    (setq nl (apply 'mapcar (cons 'list lst)))
    (progn
        (setq lst (vl-sort lst '(lambda (l1 l2) (< (length l1) (length l2)))))
        (while lst
           (setq nl (apply 'mapcar(cons 'list lst) )
                     l    (length (car lst))
                     lst (vl-member-if '(lambda (x) (> (length x) l)))
                                                     (cdr lst)
                           )
              )
         )
         (setq nl (reverse (mapcar 'reverse nl)))
     )
   )
   nl
)
未测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-16 08:17:20 | 显示全部楼层
ll_j 发表于 2013-11-15 21:30
我现在是很不讨喜的一个人,不过还是要说一点的。
这个问题以前论坛里出现过,但有些歧义的东西到最终也没 ...

虽然说得有点偏题,但是你考虑问题 挺严谨,这个问题说得好,可以把这个先解决了 在弄个新的题目 建个帖子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-16 09:19:59 | 显示全部楼层
104976 个数据
测试结果
牢固的递归法  .031  秒 结果正确
下面两个结果均有问题
这个数据处理不需要过多考虑效率问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-11-16 09:24:16 | 显示全部楼层
补充一下 前面数据 只是列表数量多,每个列表数量还是限于3个测试,每组在增加数量没有测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 16:44 , Processed in 0.482439 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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