明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1081|回复: 9

[提问] 怎么把表1维位置和多维位置互转

[复制链接]
发表于 2019-4-14 23:54:24 | 显示全部楼层 |阅读模式
本帖最后由 taoyi0727 于 2019-4-15 09:19 编辑

(setq lst '(a (b c) (d (e f g) h) i (j k)))
(function-1-n lst 6)--->'(2 1 1)
(function-1-n lst 3)--->'(1 1)

(function-n-1 lst ' (2 1 0))--->5
(function-n-1 lst ' (2 2))--->8

想好好久想不出来 这个逻辑头痛

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-4-15 16:03:13 | 显示全部楼层
你没有说清楚到达想要什么,看得我们一头雾水。建议多用用论坛的搜索功能。
 楼主| 发表于 2019-4-15 16:54:49 | 显示全部楼层
fl202 发表于 2019-4-15 16:03
你没有说清楚到达想要什么,看得我们一头雾水。建议多用用论坛的搜索功能。

(setq lst '(a (b c) (d (e f g) h) i (j k)))
(function-1-n lst 6)--->'(2 1 1)
就是把表看着成1维的表 '(a b c d e f g h I J k)里面的第6个素=f位置
返回 (nth 2 lst)==>'(d (e f g) h)
       (nth 1 '(d (e f g) h))==>' (e f g)
       (nth 1 '(e f g)==>f
得到'(2 1 1)
发表于 2019-4-16 08:59:59 | 显示全部楼层
_$ (defun f(lst)
(if (vl-catch-all-error-p (vl-catch-all-apply 'strcat lst))
         (if (vl-catch-all-error-p (vl-catch-all-apply 'strcat (list (car lst))))
             (setq va (strcat (f (car lst)) (f (cdr lst))))
         (setq va (strcat (car lst) (f (cdr lst))))
      )
     (setq va (apply 'strcat lst))
  )
)
(f '(("a" "b") "c" (("d" "e") "f")))
F
"abcdef"

(defun f1(lst str)
(setq flag t)
(if (member str lst)
     (setq flag nil va (list (vl-position str lst)))  
     (setq va (last (vl-remove nil  (mapcar '(lambda (x) (if (and flag  (vl-catch-all-error-p (vl-catch-all-apply 'strcat (list str x))))
                                                
                                     (setq  va (cons (vl-position x lst) (f1 x str)))
                                                                 (setq  va nil)
                                                                  ))
                                          lst
                        )
                        )
         )
  )
)
)
F1
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "d")
(2 0 0)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "a")
(0 0)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "b")
(0 1)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "c")
(1)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "d")
(2 0 0)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "e")
(2 0 1)
_$ (f1 '(("a" "b") "c" (("d" "e") "f")) "f")
(2 1)
_$ (f1 '(("a" "b") "c" ("g "("d" "e") "f")) "f")
(2 2)
_$ (f1 '(("a" "b") "c" ("g "("d" ("e" "k") "f"))) "e")
(2 1 1 0)
_$
 楼主| 发表于 2019-4-16 09:39:59 | 显示全部楼层
mahuan1279 发表于 2019-4-16 08:59
_$ (defun f(lst)
(if (vl-catch-all-error-p (vl-catch-all-apply 'strcat lst))
         (if (vl-catc ...

帅哥  你理解错了
这个和表里的内容没有关系  主要是要表的结够计算位置
(setq lst '(1 (2 3) (4 5 6) 7 (8)))
_$ (f1 lst 4);(函数名 表 整数)
返回表里的第4个数的位置
(nth 2 lst)-->'(4 5 6)
(nth 0 '(4 5 6)-->4;这个4不是要4本身这个值,是要这个值所在表的多维位置
得到'(2 0)


反之
_$  (f1 lst '(4 0))  返回8  这个8不是8这个值的本身,要这个值所在表的1维位置
发表于 2019-4-16 14:43:09 | 显示全部楼层
  1. (defun abc (lst n / lst1 aa ii bb nlst)
  2.   (defun AppendAll (lst)
  3.     (while (vl-some 'listp lst)
  4.       (setq lst        (mapcar        '(lambda (x) (if (listp x) x (list x)))lst)
  5.             lst        (apply 'append lst)
  6.       )
  7.     )
  8.     lst
  9.   )
  10.   (setq        aa   (nth (1- n) (AppendAll lst))
  11.         nlst '()
  12.         ii   0
  13.   )
  14.   (while (setq bb (car lst))
  15.     (setq lst (cdr lst))
  16.     (cond ((and (/= (type bb) 'LIST) (equal bb aa))
  17.            (setq nlst (cons ii nlst)
  18.                  ii   -1
  19.            )
  20.           )
  21.           ((and (= (type bb) 'LIST) (member aa (AppendAll bb)))
  22.            (setq nlst (cons ii nlst)
  23.                  lst  bb
  24.                  ii   -1
  25.            )
  26.           )
  27.     )
  28.     (setq ii (1+ ii))
  29.   )
  30.   (reverse nlst)
  31. )
 楼主| 发表于 2019-4-16 15:40:17 | 显示全部楼层
本帖最后由 taoyi0727 于 2019-4-16 15:42 编辑

这个有点烧脑,脑子不太灵光

院长脑子就是好使  一下搞定
谢谢
能否麻烦写下倒回来的
(函数 表 [ list ]  多维表位置 [ list ])  返回:1维位置[int]

点评

没兴趣再折腾  发表于 2019-4-16 18:21
发表于 2019-4-16 21:04:13 | 显示全部楼层
_$ (setq lst '(a (b c) (d (e f g) h) i (j k)))
(defun f1 (lst)
  (if (= 0 (apply '+ (mapcar '(lambda (x) (if x 1 0))   (mapcar 'listp lst))))
    (setq va (mapcar '(lambda (y) (list (vl-position y lst))) lst))
    (setq va (mapcar '(lambda (y) (if (listp y)
                                          (list (vl-position y lst) (f1 y))
                                                                          (list (vl-position y lst))
                                                                   )
                                                )
                                lst)
        )
  )
)
(defun f2 (lst)
  (if (= (length lst) 1)
      (if (cdr (car lst))
              (setq vlst (mapcar '(lambda (x) (cons (car (car lst)) x)) (f2 (car (cdr (car lst))))))
          (setq vlst (list (car lst)))
       )      
        (setq vlst (append (f2 (list (car lst))) (f2 (cdr lst))))
  )
)
(defun function-1-n (i lst)
    (nth (- i 1) (f2 (f1 lst)))
)
(defun function-n-1 (lst1 lst)
    (+ 1 (vl-position lst1 (f2 (f1 lst))))
)
(A (B C) (D (E F G) H) I (J K))
F1
F2
FUNCTION-1-N
FUNCTION-N-1
_$ (function-1-n 1 lst)
(0)
_$ (function-1-n 2 lst)
(1 0)
_$ (function-1-n 3 lst)
(1 1)
_$ (function-1-n 4 lst)
(2 0)
_$ (function-1-n 5 lst)
(2 1 0)
_$ (function-1-n 6 lst)
(2 1 1)
_$ (function-1-n 7 lst)
(2 1 2)
_$ (function-1-n 8 lst)
(2 2)
_$ (function-1-n 9 lst)
(3)
_$  (function-1-n 10 lst)
(4 0)
_$ (function-1-n 11 lst)
(4 1)
_$ (function-n-1 '(0) lst)
1
_$ (function-n-1 '(1 0) lst)
2
 楼主| 发表于 2019-4-17 12:22:06 | 显示全部楼层
mahuan1279 发表于 2019-4-16 21:04
_$ (setq lst '(a (b c) (d (e f g) h) i (j k)))
(defun f1 (lst)
  (if (= 0 (apply '+ (mapcar '(lamb ...

谢谢帮助  完美
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 22:43 , Processed in 0.192783 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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