明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2345|回复: 15

[讨论] 求一个按长度拆分表成子表的函数

[复制链接]
发表于 2023-7-5 12:08:14 | 显示全部楼层 |阅读模式
本帖最后由 wharan 于 2023-7-5 23:56 编辑

有一个表,表中有若干元素,要求把该表按长度拆分成子表。长度不足时用空格补足。

如:把表(1 2 3 4 5 6 7 8 9 10 11)按长度3拆分成((1 2 3) (4 5 6) (7 8 9) (10 11 ""))
      表(1 2 3) 按长度5拆分成(1 2 3 "" "")


yoyoho大侠的函数完美解决问题,在这里共享。
对所有热心的朋友表示感谢。
(defun list:split (lst x / lst2)
(setq lst3 lst)
(repeat (- x (rem (length lst) x))
        (setq lst3 (append lst3 (list "")))
)
(setq lst lst3)
  (foreach n lst
    (if        (and lst2 (/= x (length (car lst2))))
      (setq lst2 (cons (append (car lst2)
                               (list n)
                       )
                       (cdr lst2)
                 )
      )
      (setq lst2 (cons (list n) lst2))
    )
  )
  (reverse lst2)
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-7-5 21:13:29 | 显示全部楼层
指令: (setq lst '(1 2 3 4 5 6 7 8 9 10 11))
(1 2 3 4 5 6 7 8 9 10 11)

指令: (list:split lst 15)
((1 2 3 4 5 6 7 8 9 10 11 "" "" "" ""))

指令: (list:split lst 3)
((1 2 3) (4 5 6) (7 8 9) (10 11 ""))

指令: (list:split lst 5)
((1 2 3 4 5) (6 7 8 9 10) (11 "" "" "" ""))

指令: (list:split lst 8)
((1 2 3 4 5 6 7 8) (9 10 11 "" "" "" "" ""))
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-5 21:12:00 | 显示全部楼层
(defun list:split (lst x / lst2)
(setq lst3 lst)
(repeat (- x (rem (length lst) x))
        (setq lst3 (append lst3 (list "")))
)
(setq lst lst3)
  (foreach n lst
    (if        (and lst2 (/= x (length (car lst2))))
      (setq lst2 (cons (append (car lst2)
                               (list n)
                       )
                       (cdr lst2)
                 )
      )
      (setq lst2 (cons (list n) lst2))
    )
  )
  (reverse lst2)
)

评分

参与人数 1明经币 +1 收起 理由
gaics + 1 神马都是浮云

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-5 13:38:15 | 显示全部楼层
(defun list-split (k lst / a bb-list-part i lst1 n)
        (defun bb-list-part
        (lst from to / l x)
        (repeat from (setq lst (cdr lst)))
        (repeat (1+ (- to from)) (setq l (cons (car lst) l)) (setq lst (cdr lst)))
        (REVERSE l)
)
        (setq n 0)
        (repeat (fix (/ (length lst ) k))
               
                (setq lst1 (append lst1 (list (bb-list-part lst n (+ n (1- k))))))
                (setq n (+ n k))
        )
        (if (/= (rem (length lst ) k) 0)
                (progn
                        (repeat (- k (rem (length lst ) k))
                        (setq a (cons "" a))       
                        )
                        (setq lst1 (append lst1 (list (append (bb-list-part lst n (1- (length lst )))a)) ))
                       
                       
                )
        )
        lst1
        )
发表于 2023-7-5 13:14:00 | 显示全部楼层
本帖最后由 vitalgg 于 2023-7-5 13:16 编辑




用 nil 补足不行吗?


  1. 命令:
  2. 命令: (list:split-3d '(1 2 3 4))
  3. ((1 2 3) (4 nil nil))
复制代码


本帖子中包含更多资源

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

x
发表于 2023-7-5 13:49:23 | 显示全部楼层
本帖最后由 liuhe 于 2023-7-6 14:18 编辑
  1. (DEFUN LH:LSTTOLST (LST1 N / LHLSTADD LST2 TEMLST)
  2.   (defun LHLSTADD (LST1 N)
  3.     (SETQ LST1 (REVERSE LST1))
  4.     (REPEAT (- N (LENGTH LST1))
  5.       (SETQ LST1 (CONS "" LST1))
  6.     )
  7.     (REVERSE LST1)
  8.   )
  9.   (REPEAT (FIX (/ (LENGTH LST1) N))
  10.     (REPEAT N
  11.       (SETQ TEMLST (CONS (CAR LST1) TEMLST)
  12.       LST1   (CDR LST1)
  13.       )
  14.     )
  15.     (SETQ LST2 (CONS (REVERSE TEMLST) LST2)
  16.     TEMLST NIL)
  17.   )
  18.   (IF (> (REM (LENGTH LST1) N) 0)
  19.     (REVERSE (CONS (LHLSTADD LST1 N) LST2))
  20.     (REVERSE LST2)
  21.   )
  22. )


这个简洁了
 楼主| 发表于 2023-7-5 15:27:41 | 显示全部楼层

这个程序,结果返回有点问题。
(LHSTTOLST '(1 2 3 4 5 6 7 8 9 10 11) 5)返回((1 2 3 4 5) (6 7 8 9 10) ("" "" 11 "" ""))
希望返回:((1 2 3 4 5) (6 7 8 9 10) (11 "" "" "" ""))
(LHSTTOLST '(1 2 3 4 5 6 7 8 9 10 11) 15) 返回((1 2 3) (4 5 6) (7 8 9) (10 11 ""))
希望返回:(1 2 3 4 5 6 7 8 9 10 11 "" “” “” “”)
 楼主| 发表于 2023-7-5 15:49:52 | 显示全部楼层
ztj988 发表于 2023-7-5 13:38
(defun list-split (k lst / a bb-list-part i lst1 n)
        (defun bb-list-part
        (lst from to / l x)

这个函数,对于简单的表,没有问题。但对于复杂的表,可能不具有通用性。
比如:(list-split 3 '((1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11))).
作为函数,应该对变量表具有通用性
发表于 2023-7-5 16:05:36 | 显示全部楼层
本帖最后由 树櫴希德 于 2023-7-6 14:42 编辑

  1. (setq l0 '(1 2 3 4 5 6 7 8 9 10 11))
  2. (setq l01 nil) (setq n 3)
  3. (repeat (- n(rem(length l0)n))  (setq l01 (append l0 (list ""))))
  4. (setq ptlst1 nil)
  5. (while  l01
  6.      (setq ptlst nil)  (repeat nn (setq ptlst (append ptlst (list(car l01) ))) (setq l01(vl-remove (car l01) l01) )  )
  7.        (setq ptlst1 (append ptlst1 (list ptlst) ))      

  8. );;;;;;;
  9. [code=lisp]
  10. (setq l0 '(1 2 3 4 5 6 7 8 9 10 11))
  11. ;(setq l01 nil)
  12. (setq nn 3)
  13. ;(repeat (- n(rem(length l0)n))  (setq l01 (append l0 (list ""))))
  14. (setq ptlst1 nil)
  15. (while  l0
  16.      (setq ptlst nil)  (repeat nn (setq ptlst (append ptlst (list(car l0) ))) (setq l0(vl-remove (car l0) l0) )  )
  17.        (setq ptlst1 (append ptlst1 (list ptlst) ))      

  18. )  
  19. (setq ptlst1 (mapcar '(LAMBDA (y)  (vl-remove-if-not '(LAMBDA (x) (/= x nil) ) y  )    )   ptlst1))
  20. ;命令: !ptlst1
  21. ;((1 2 3) (4 5 6) (7 8 9) (10 11))
 楼主| 发表于 2023-7-5 16:11:14 | 显示全部楼层
vitalgg 发表于 2023-7-5 13:14
用 nil 补足不行吗?

这个函数比较简洁,具有通用性。但没有补位。

(defun list:split (lst x / lst2)
  (foreach n lst
    (if        (and lst2 (/= x (length (car lst2))))
      (setq lst2 (cons (append (car lst2)
                               (list n)
                       )
                       (cdr lst2)
                 )
      )
      (setq lst2 (cons (list n) lst2))
    )
  )
  (reverse lst2)
)

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

本版积分规则

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

GMT+8, 2024-11-16 22:56 , Processed in 0.180207 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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