如何对列表重组?
本帖最后由 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 蒋八 韩九))
)
这个怎么搞?
我的代码:
(defun arrange_list(arrange_data / l_data tmp_data first_data line_data end_data)
(setq first_data '()
l_data '()
end_data '()
tmp_data '())
(setq first_data (car (car arrange_data)))
;(setq l_data (list (list(car (car arrange_data))) (cdr (car arrange_data))))
(setq l_data (append l_data (list first_data)))
(setq l_data (append l_data ((cdr (car arrange_data)))))
(foreach line_data arrange_data
(progn
(setq tmp_data (car line_data))
(if (/= tmp_data first_data)
(progn
;(append l_data (list tmp_data))
;(append l_data (cdr line_data))
(setq end_data (list end_data(list l_data)))
(setq l_data '())
(setq l_data (append l_data (list tmp_data)))
(setq l_data (append l_data (list(cdr line_data))))
)
(progn
(setq l_data (append l_data (list(cdr line_data))))
)
);end of if
);end of progn
);end of foreach
(setq end_data (append end_data (list l_data)))
)
发现一个cons函数,但是好像是往表的前面加元素 本帖最后由 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)))
本帖最后由 zhhunicorn 于 2011-6-7 14:47 编辑
楼上代码看起来好简洁,但是对我来说好晕
不管那么多,我试了一下
经过(mapcar '(lambda (X) (read(strcat "("(vl-string-subst ")(" ","(vl-princ-to-string X))")")))
l_data
)表达式的运算后l_data的值好像没变化。
补充一下,“,”是应该不要的。
或者这样提问:
有一个表叫做表a,里面有一个或多个元素,每个元素都是另一个表。
有另一个表叫做表n,怎么把表n加到表a的最后,并把表n做为表a的一个元素。
表a=(表1 表2 表3...)
加入后:
表a=(表1 表2 表3... 表n) 所以我明知道你提问错误,但怎么办,我如何猜测你的意图是什么呢???!
还有,最好把全角的括号换成半角的,别人帮你的时候很麻烦 本帖最后由 caoyin 于 2011-6-7 15:14 编辑
回5楼
(setq LST1 '(1 2 3 4 5)
LST2 '(6)
)
(append LST1 LST2)
唉
本帖最后由 zhhunicorn 于 2011-6-7 15:42 编辑晕了,。。。
多打了一对括号! 本帖最后由 zhhunicorn 于 2011-6-7 16:04 编辑
终于搞定了,谢谢caoyin。
(defun arrange_list(arrange_data / l_data tmp_data first_data line_data end_data)
(setq first_data '()
l_data '()
end_data '()
tmp_data '())
(setq first_data '"")
(foreach line_data arrange_data
(progn
(setq tmp_data (car line_data))
(if (/= tmp_data first_data)
(progn
;(append l_data (list tmp_data))
;(append l_data (cdr line_data))
(setq end_data (append end_data(list l_data)))
(setq l_data '())
(setq l_data (appendl_data (list tmp_data)))
(setq l_data (append (list l_data) (list(cdr line_data))))
(setq first_data tmp_data)
)
(progn
(setq l_data (append l_data (list(cdr line_data))))
)
);end of if
);end of progn
);end of foreach
(setq end_data (append end_data (list l_data)))
(setq end_data (cdr end_data))
)
页:
[1]