明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 695|回复: 9

[已解答] 求高手简写代码

[复制链接]
发表于 2015-7-27 16:04 | 显示全部楼层 |阅读模式
本帖最后由 stoyer 于 2015-7-27 16:35 编辑

以下代码实际上是对根据list1对list2进行排序, 只写了3个表项示例, 麻烦高手简写一下>><

(cond ((= (nth 0 list1) "JZZD") (setq a1 (nth 1 list2)))
      ((= (nth 0 list1) "HZZD") (setq a1 (nth 3 list2)))
          ((= (nth 0 list1) "FZZD") (setq a1 (nth 2 list2)))
)
(cond ((= (nth 1 list1) "JZZD") (setq a2 (nth 1 list2)))
      ((= (nth 1 list1) "HZZD") (setq a2 (nth 3 list2)))
          ((= (nth 1 list1) "FZZD") (setq a2 (nth 2 list2)))
)
(cond ((= (nth 2 list1) "JZZD") (setq a3 (nth 1 list2)))
      ((= (nth 2 list1) "HZZD") (setq a3 (nth 3 list2)))
          ((= (nth 2 list1) "FZZD") (setq a3 (nth 2 list2)))
)

补充:
L2里面的值不固定, 但顺序是固定的; L1的值是固定的,但顺序不固定(L1相当于表头名称).
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-7-27 16:15 | 显示全部楼层
牢固版主的代码,希望对你有用~
  1. (vl-sort '(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二")))
  2.          '(lambda (a b) (< (VL-POSITION (car a) '("赵" "钱" "孙" "李")) (VL-POSITION (car b) '("赵" "钱" "孙" "李")))))
复制代码
发表于 2015-7-27 16:17 | 显示全部楼层
本帖最后由 77077 于 2015-7-27 16:21 编辑

将L1按照L2的顺序排列~~~
(setq l1 '(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二")))
        l2 '("赵" "钱" "孙" "李")
      )
(mapcar
         '(lambda(x)
            (vl-remove-if-not
                    '(lambda(y)(=(car y) x))
                    l1
                    )
                 )
   l2
)
 楼主| 发表于 2015-7-27 16:19 | 显示全部楼层
谢了! 我试试先, mapcar/lambda这些看着就头巨大...
 楼主| 发表于 2015-7-27 16:25 | 显示全部楼层
77077 发表于 2015-7-27 16:17
将L1按照L2的顺序排列~~~
(setq l1 '(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李 ...

谢谢77.
这个好像不行, 我的L2里面的值不是固定的, 但顺序是固定的. L1的值是固定的,但顺序不固定(L1相当于表头名称).
发表于 2015-7-27 16:37 | 显示全部楼层
你要把表发出来撒
发表于 2015-7-27 16:39 | 显示全部楼层
(mapcar '(lambda (x) (cdr (assoc x (mapcar 'cons '("JZZD" "FZZD" "HZZD") (cdr List2))))) List1)
 楼主| 发表于 2015-7-27 16:45 | 显示全部楼层
77077 发表于 2015-7-27 16:37
你要把表发出来撒

;正确List1,这个是正确顺序的,实际上是一个块多个属性,由于实际操作的时候被炸开了再重新做成块,所以就乱了.
("JZZD" "HZZD" "GZZD" "ZDHX" "KHX" "DSX")

;List2, 这个顺序固定的.
("23.5" "64.3" "A" "GB" "GT" "GH")
....
发表于 2015-7-27 18:14 | 显示全部楼层
大概意思是L1的属性标记,L2是属性值。
现在要将L2的值对应上L1,是吗。
发表于 2015-7-27 19:16 | 显示全部楼层
  1. ;;;根据cond得出
  2. ;;;(= "JZZD" (nth 1 l2)) => 0
  3. ;;;(= "HZZD" (nth 3 l2)) => 2
  4. ;;;(= "FZZD" (nth 2 l2)) => 1
  5. (defun c:tt(/ l3 l1 l2 l4 lst x y)
  6. (setq l3 '(("JZZD" . 0)("FZZD" . 1)("HZZD" . 2)))
  7. (setq l1 '("FZZD" "JZZD" "HZZD"))
  8. (setq l2 '("jz" "fz" "hz"))
  9. (setq l4 l1 lst '())
  10. (while(setq a(car l4))
  11.   (setq lst(cons (cdr(assoc a l3)) lst))
  12.   (setq l4(cdr l4))
  13.   )
  14. (setq lst (reverse lst))
  15.   ;返回 (1 0 2)
  16. (setq l5(mapcar '(lambda(x y)(cons x y)) lst l2))
  17.   ;返回 ((1 . "jz") (0 . "fz") (2 . "hz"))
  18. (setq l6(vl-sort l5 '(lambda(x y)(< (car x)(car y)))))
  19.   ;返回 ((0 . "fz") (1 . "jz") (2 . "hz"))
  20.   (mapcar 'cdr l6)
  21.   ;返回 ("fz" "jz" "hz")

  22.   ;辅值a1 a2 a3
  23.   (mapcar 'set '(a1 a2 a3) '("fz" "jz" "hz"))
  24.   ;返回
  25. ;;;("fz" "jz" "hz")
  26. ;;;_$ a1
  27. ;;;"fz"
  28. ;;;_$ a2
  29. ;;;"jz"
  30. ;;;_$ a3
  31. ;;;"hz"
  32. ;;;_$
  33.   )

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
stoyer + 1 + 50

查看全部评分

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

本版积分规则

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

GMT+8, 2024-4-25 09:20 , Processed in 0.521725 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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