明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1288|回复: 8

[基础] 如何对列表重组?

[复制链接]
发表于 2011-6-7 14:04:50 | 显示全部楼层 |阅读模式
本帖最后由 zhhunicorn 于 2011-6-7 15:29 编辑

l_data=((一年级 班级1 王二 张三)(一年级 班级2 李四 赵五)(一年级 班级3 钱六 孙七)
           (二年级 班级1 周八 吴九)(二年级 班级2 郑十 何一)(二年级 班级3 吕二 施三)
           (三年级 班级1 冯四 陈五)(三年级 班级2 褚六 魏七)(三年级 班级3 蒋八 韩九))
我需要把它变成:
l_data=(
            ((一年级)(班级1 王二 张三)(班级2 李四 赵五)(班级3  钱六 孙七))
            ((二年级)(班级1 周八 吴九)(班级2 郑十 何一)(班级3 吕二 施三))
            ((三年级)(班级1 冯四 陈五)(班级2 褚六 魏七)(班级3 蒋八 韩九))
             )
这个怎么搞?
我的代码:
  1. (defun arrange_list(arrange_data / l_data tmp_data first_data line_data end_data)
  2.   (setq first_data '()
  3.   l_data '()
  4.   end_data '()
  5.   tmp_data '())
  6.   (setq first_data (car (car arrange_data)))
  7.   ;(setq l_data (list (list(car (car arrange_data))) (cdr (car arrange_data))))
  8.   (setq l_data (append l_data (list first_data)))
  9.   (setq l_data (append l_data ((cdr (car arrange_data)))))
  10.   (foreach line_data arrange_data
  11.     (progn
  12.     (setq tmp_data (car line_data))
  13.      (if (/= tmp_data first_data)
  14.          (progn
  15.             ;(append l_data (list tmp_data))
  16.             ;(append l_data (cdr line_data))
  17.       (setq end_data (list end_data  (list l_data)))
  18.             (setq l_data '())
  19.       (setq l_data (append l_data (list tmp_data)))
  20.       (setq l_data (append l_data (list(cdr line_data))))
  21.           )
  22.          (progn
  23.            (setq l_data (append l_data (list(cdr line_data))))
  24.          )
  25.         );end of if
  26.     );end of progn
  27.     );end of foreach
  28.   (setq end_data (append end_data (list l_data)))
  29. )

 楼主| 发表于 2011-6-7 14:28:21 | 显示全部楼层
发现一个cons函数,但是好像是往表的前面加元素
发表于 2011-6-7 14:32:29 | 显示全部楼层
本帖最后由 caoyin 于 2011-6-7 14:35 编辑

;;;楼主所想要的肯定跟描述的不一样,——一般这样的数据结构没什么用——但我还是按照你的描述编程,
(setq l_data '((一年级,班级1,姓名1,姓名2)(一年级,班级2,姓名1,姓名2)(一年级,班级3,姓名1,姓名2)
           (二年级,班级1,姓名1,姓名2)(二年级,班级2,姓名1,姓名2)(二年级,班级3,姓名1,姓名2)
           (三年级,班级1,姓名1,姓名2)(三年级,班级2,姓名1,姓名2)(三年级,班级3,姓名1,姓名2))
)
(mapcar '(lambda (X) (read(strcat "("(vl-string-subst ")(" ","  (vl-princ-to-string X))")")))
        l_data
)
->
(((一年级) (班级1,姓名1,姓名2)) ((一年级) (班级2,姓名1,姓名2)) ((一年级) (班级3,姓名1,姓名2)) ((二年级)
(班级1,姓名1,姓名2)) ((二年级) (班级2,姓名1,姓名2)) ((二年级) (班级3,姓名1,姓名2)) ((三年级)
(班级1,姓名1,姓名2)) ((三年级) (班级2,姓名1,姓名2)) ((三年级) (班级3,姓名1,姓名2)))
 楼主| 发表于 2011-6-7 14:44:52 | 显示全部楼层
本帖最后由 zhhunicorn 于 2011-6-7 14:47 编辑

楼上代码看起来好简洁,但是对我来说好晕
不管那么多,我试了一下
经过(mapcar '(lambda (X) (read(strcat "("(vl-string-subst ")(" ","  (vl-princ-to-string X))")")))
        l_data
)表达式的运算后l_data的值好像没变化。
补充一下,“,”是应该不要的。
 楼主| 发表于 2011-6-7 14:58:11 | 显示全部楼层
或者这样提问:
有一个表叫做表a,里面有一个或多个元素,每个元素都是另一个表。
有另一个表叫做表n,怎么把表n加到表a的最后,并把表n做为表a的一个元素。
表a=(表1 表2 表3...)
加入后:
表a=(表1 表2 表3... 表n)
发表于 2011-6-7 15:10:54 | 显示全部楼层
所以我明知道你提问错误,但怎么办,我如何猜测你的意图是什么呢???!
还有,最好把全角的括号换成半角的,别人帮你的时候很麻烦

点评

说的好,我重新编辑下提问  发表于 2011-6-7 15:15
发表于 2011-6-7 15:13:01 | 显示全部楼层
本帖最后由 caoyin 于 2011-6-7 15:14 编辑

回5楼
(setq LST1 '(1 2 3 4 5)
         LST2 '(6)
)

(append LST1 LST2)
 楼主| 发表于 2011-6-7 15:37:37 | 显示全部楼层

本帖最后由 zhhunicorn 于 2011-6-7 15:42 编辑

晕了,。。。
多打了一对括号!
 楼主| 发表于 2011-6-7 16:04:23 | 显示全部楼层
本帖最后由 zhhunicorn 于 2011-6-7 16:04 编辑

终于搞定了,谢谢caoyin。

  1. (defun arrange_list(arrange_data / l_data tmp_data first_data line_data end_data)
  2.   (setq first_data '()
  3. l_data '()
  4. end_data '()
  5. tmp_data '())
  6.   (setq first_data '"")
  7.   (foreach line_data arrange_data
  8.     (progn
  9.    (setq tmp_data (car line_data))
  10.     (if (/= tmp_data first_data)
  11.         (progn
  12.          ;(append l_data (list tmp_data))
  13.          ;(append l_data (cdr line_data))
  14.    (setq end_data (append end_data  (list l_data)))
  15.          (setq l_data '())
  16.    (setq l_data (append  l_data (list tmp_data)))
  17.    (setq l_data (append (list l_data) (list(cdr line_data))))
  18.     (setq first_data tmp_data)
  19.         )
  20.         (progn
  21.         (setq l_data (append l_data (list(cdr line_data))))
  22.        )
  23.        );end of if
  24.    );end of progn
  25.     );end of foreach
  26.   (setq end_data (append end_data (list l_data)))
  27.   (setq end_data (cdr end_data))
  28. )

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

本版积分规则

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

GMT+8, 2025-7-26 08:43 , Processed in 0.206776 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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