乐筑天下

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

[编程交流] 将列表划分为多个列表

[复制链接]

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 20:25:00 | 显示全部楼层 |阅读模式
大家好,
我想写一个小代码,将一个列表划分为多个列表,并在to分隔符之间。
示例:(listToManyLists lst“{”“}”)
 
  1. (setq f (open (strcat "c:\\1.txt" "r""))
  2. (while (setq x (read-line f)) (setq lst (cons x lst)))
  3. (listToManyLists lst "{" "}")
  4. (defun listToManyLists  ( lst sep1 sep2 / x y e f)
  5. (if lst
  6. (progn
  7. (setq f t)
  8. (while lst
  9.    (setq x (car lst))
  10.    (if (= x sep1) (setq f t))
  11.    (if (= x sep2) (setq f nil))
  12.    (if f (setq y (cons x y)))
  13.    (setq lst (cdr lst))
  14.   );while
  15. );progn
  16. );if
  17. y
  18. );defun  

 
这是将列表划分为多个列表的最快方法吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:32:27 | 显示全部楼层
你能举一个输入数据的例子吗?
回复

使用道具 举报

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 20:39:14 | 显示全部楼层
 
文件。。。1.txt。txt文件
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:46:55 | 显示全部楼层
也许是这样?
  1. (defun c:test ( / des lst str sub txt )
  2.    (if (and (setq txt (findfile "1.txt"))
  3.             (setq des (open txt "r"))
  4.        )
  5.        (progn
  6.            (while (setq str (read-line des))
  7.                (if (wcmatch str "{,}")
  8.                    (if sub
  9.                        (setq lst (cons (reverse sub) lst)
  10.                              sub nil
  11.                        )
  12.                    )
  13.                    (setq sub (cons str sub))
  14.                )
  15.            )
  16.            (close des)
  17.            (if sub (setq lst (cons (reverse sub) lst)))
  18.            (print (reverse lst))
  19.        )
  20.        (princ "\n1.txt not found.")
  21.    )
  22.    (princ)
  23. )
回复

使用道具 举报

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 20:51:23 | 显示全部楼层
 
非常聪明的李。。。(如果(wcmatch str{,}”)。。。
非常感谢。
回复

使用道具 举报

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 20:57:38 | 显示全部楼层
这可能是将列表划分为多个列表的最快方法。递归不是好方法。
回复

使用道具 举报

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 21:05:07 | 显示全部楼层
 
  1. (defun c:test ( / des lst str sub txt goIn )
  2. ; created by Lee Mac
  3. ; updated by Vlisp
  4.    (if (and (setq txt (findfile "c:\\1.txt"))
  5.             (setq des (open txt "r"))
  6.        )
  7.        (progn
  8.   (setq lst nil
  9.         sub nil
  10.         x nil
  11.         )
  12.            (while (setq str (read-line des))
  13.       (if (= str "{") (setq goIn t))
  14.       (if goIn (setq x (cons str x)))
  15.       (if (= str "}")
  16.         (progn
  17.           (setq lst (cons (reverse x) lst)
  18.                 goIn nil
  19.                 x nil
  20.                 )
  21.            );progn
  22.       );if
  23.     );while
  24.   (close des)
  25.   lst
  26. );progn
  27.      (princ "\n1.txt not found.")
  28.      );if
  29. );defun

 
输入数据。。。1-upd。txt文件
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:11:25 | 显示全部楼层
 
不客气!
 
 
如果愿意,您可以使用递归-下面是编写函数的另一种方法:
  1. (defun c:test ( / des lst str txt )
  2.    (if (and (setq txt (findfile "1.txt"))
  3.             (setq des (open txt "r"))
  4.        )
  5.        (progn
  6.            (while (setq str (read-line des))
  7.                (setq lst (cons str lst))
  8.            )
  9.            (close des)
  10.            (grouplist lst "{" "}")
  11.        )
  12.    )
  13. )
  14. (defun grouplist ( lst ch1 ch2 / foo itm )
  15.    (defun foo ( lst acc )
  16.        (cond
  17.            (   (null lst) (list (reverse acc)))
  18.            (   (= ch2 (car lst)) (cons (reverse (cons ch2 acc)) (grouplist (cdr lst) ch1 ch2)))
  19.            (   (foo (cdr lst) (cons (car lst) acc)))
  20.        )
  21.    )
  22.    (if (setq itm (member ch1 lst))
  23.        (foo itm nil)
  24.    )
  25. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:17:21 | 显示全部楼层
下面是另一种可能的书写方式:
  1. (defun c:test ( / des lst str sub txt )
  2.    (if (and (setq txt (findfile "1.txt"))
  3.             (setq des (open txt "r"))
  4.        )
  5.        (progn
  6.            (while (setq str (read-line des))
  7.                (if (= "{" str)
  8.                    (progn
  9.                        (while (and str (/= "}" str))
  10.                            (setq sub (cons str sub)
  11.                                  str (read-line des)
  12.                            )
  13.                        )
  14.                        (if str (setq sub (cons str sub)))
  15.                        (setq lst (cons (reverse sub) lst)
  16.                              sub nil
  17.                        )
  18.                    )  
  19.                )
  20.            )
  21.            (close des)
  22.            (reverse lst)
  23.        )
  24.    )
  25. )
回复

使用道具 举报

7

主题

26

帖子

16

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 21:21:09 | 显示全部楼层
 
谢谢李!
我认为这个递归(grouplist)是比迭代函数(c:test)更快的函数
再次感谢!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 09:05 , Processed in 1.042691 second(s), 72 queries .

© 2020-2025 乐筑天下

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