乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 9

[编程交流] 拆分列表

[复制链接]

96

主题

351

帖子

62

银币

中流砥柱

Rank: 25

铜币
692
发表于 2022-7-5 18:37:02 | 显示全部楼层 |阅读模式
李的作用:
  1. ; Iterative Version
  2. ;; Group by Number  -  Lee Mac
  3. ;; Groups a list 'l' into a list of lists, each of length 'n'
  4. (defun LM:groupbynum ( l n / a b )
  5.    (while l
  6.        (repeat n
  7.            (setq a (cons (car l) a)
  8.                  l (cdr l)
  9.            )
  10.        )
  11.        (setq b (cons (reverse a) b)
  12.              a nil
  13.        )
  14.    )
  15.    (reverse b)
  16. )

 
用法:
_$(LM:groupbynum’(“A”“B”“C”“D”“E”“F”)2)
((“A”“B”)(“C”“D”)(“E”“F”))
 
 
_1$(LM:groupbynum’(“A”“B”“C”“D”“E”“F”)5)
((“A”“B”“C”“D”“E”)(“F”nil nil)
 
我想要:
_1$(LM:groupbynum’(“A”“B”“C”“D”“E”“F”)5)
(“A”“B”“C”“D”“E”)(“F”))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:47:52 | 显示全部楼层
这里有一种可能的方法:
  1. (defun foo ( l n )
  2.    (if l (bar (cons nil l) n n))
  3. )
  4. (defun bar ( l m n )
  5.    (if (and (cdr l) (< 0 n))
  6.        (bar (cons (cons (cadr l) (car l)) (cddr l)) m (1- n))
  7.        (cons (reverse (car l)) (foo (cdr l) m))
  8.    )
  9. )
  1. _$ (foo '(1 2 3 4 5 6) 2)
  2. ((1 2) (3 4) (5 6))
  3. _$ (foo '(1 2 3 4 5 6) 3)
  4. ((1 2 3) (4 5 6))
  5. _$ (foo '(1 2 3 4 5 6) 4)
  6. ((1 2 3 4) (5 6))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:57:02 | 显示全部楼层
另一种迭代方法:
  1. (defun gbn ( l n / a b m )
  2.    (while l
  3.        (setq m n)
  4.        (while (and l (< 0 m))
  5.            (setq a (cons (car l) a)
  6.                  l (cdr l)
  7.                  m (1- m)
  8.            )
  9.        )
  10.        (setq b (cons (reverse a) b)
  11.              a nil
  12.        )
  13.    )
  14.    (reverse b)
  15. )
  1. _$ (gbn '("A" "B" "C" "D" "E" "F") 5)
  2. (("A" "B" "C" "D" "E") ("F"))
回复

使用道具 举报

96

主题

351

帖子

62

银币

中流砥柱

Rank: 25

铜币
692
发表于 2022-7-5 19:00:12 | 显示全部楼层
 
李,非常感谢!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:07:58 | 显示全部楼层
另一个具有mapcar和lambda功能。
 
  1. (defun _split:list (l r / _l _lst)
  2. ;; Tharwat 17.09.2015    ;;
  3. (mapcar '(lambda (x)
  4.             (setq _l (cons x _l))
  5.             (if (= (length _l) r)
  6.               (setq _lst (cons (reverse _l) _lst)
  7.                     _l   nil
  8.               )
  9.             )
  10.           )
  11.          l
  12. )
  13. (if _l
  14.    (setq _lst (cons (reverse _l) _lst))
  15. )
  16. (reverse _lst)
  17. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:15:17 | 显示全部楼层
 
FWIW,由于您没有使用mapcar返回的列表,因此使用foreach循环(尤其是在优化为FAS时)会更有效,即:
  1. (defun foo ( l n / a b i )
  2.    (setq i 0)
  3.    (foreach x l
  4.        (setq a (cons x a)
  5.              i (1+ i)
  6.        )
  7.        (if (zerop (rem i n))
  8.            (setq b (cons (reverse a) b)
  9.                  a nil
  10.            )
  11.        )
  12.    )
  13.    (reverse (if a (cons (reverse a) b) b))
  14. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:18:15 | 显示全部楼层
 
感谢您有时间阅读和评论代码。
 
是的,乍一看,mapcar的性能比foreach函数要好得多,尽管我没有在FAS格式的文件中测试它们。
 
无论如何,函数的内容在某种程度上看起来是相同的:
 
  1. (defun _split:list (l r / _l _lst)
  2. (foreach x l
  3.    (setq _l (cons x _l))
  4.    (if (= (length _l) r)
  5.      (setq _lst (cons (reverse _l) _lst)
  6.            _l   nil
  7.      )
  8.    )
  9. )
  10. (reverse (if _l
  11.             (setq _lst (cons (reverse _l) _lst))
  12.             _lst
  13.           )
  14. )
  15. )
回复

使用道具 举报

96

主题

351

帖子

62

银币

中流砥柱

Rank: 25

铜币
692
发表于 2022-7-5 19:27:22 | 显示全部楼层
谢谢李和塔瓦。
 
在你的帮助下,我完成了我的工作。
http://www.cadtutor.net/forum/showthread.php?93867-属性编辑器问题&p=642526&viewfull=1#post642526
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:34:38 | 显示全部楼层
 
不客气。
 
 
我知道你已经为那个程序创建了这个线程,我真的很高兴你能自己完成它
回复

使用道具 举报

96

主题

351

帖子

62

银币

中流砥柱

Rank: 25

铜币
692
发表于 2022-7-5 19:38:26 | 显示全部楼层
通常都是像剑一样锋利的眼睛。
 
 
谢谢塔瓦。对那个项目有什么建议吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 13:21 , Processed in 0.782037 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表