乐筑天下

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

[编程交流] 将列表分成两个子列表

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 18:44:08 | 显示全部楼层 |阅读模式
我想把一个列表分成两个子列表,如下所示:
 
列表:(a b c d e f g)
 
然后得到
 
L1作为(a b c d)和L2作为(e f g)。
 
很容易得到第二个L2和(成员e ls),坦率地说,我可以得到带有“foreach”和“cons”函数的L1,但这似乎是一个代码。有没有像“member”这样的函数可以更快地获得L1,并且代码更少?可能是vl函数?
 
非常感谢。
回复

使用道具 举报

0

主题

9

帖子

12

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:49:40 | 显示全部楼层
在那里投几个反转怎么样?因此,获得L1就像获得L2:
 
(反向(成员d(反向ls)))
 
我绝对不是Lisp程序专家,所以对我的建议持保留态度。
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:57:55 | 显示全部楼层
Gile Chanteau的这一职能:
 
您提供的n是第一个列表中的元素数
我在名单上。
 
  1. defun breakAt (n l / r)
  2. (while (and l (< 0 n))
  3.    (setq r (cons (car l) r)
  4.   l (cdr l)
  5.   n (1- n)
  6.    )
  7. )
  8. (list (reverse r) l)
  9. )

 
也可以使用函数trunc
作者:Gile Chanteau
 
您提供expr和列表。在你的情况下,expr将是e
 
  1. (defun trunc        (expr lst)
  2. (if (and lst
  3.    (not (equal (car lst) expr))
  4.      )
  5.    (cons (car lst) (trunc expr (cdr lst)))
  6. )
  7. )

 
因此,您的第一个列表是:
 
  1. (setq L1 (trunc e  lst))

 
第二个:
[code]3)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:00:53 | 显示全部楼层
另一个:
  1. (defun breakatitem ( x l / r )
  2.    (setq l (vl-member-if '(lambda ( y ) (setq r (cons y r)) (equal x y)) l))
  3.    (list (reverse (cdr r)) l)
  4. )
  1. _$ (breakatitem 'e '(a b c d e f g))
  2. ((A B C D) (E F G))
  3. _$ (breakatitem 'h '(a b c d e f g))
  4. ((A B C D E F) nil)
  5. _$ (breakatitem 'a '(a b c d e f g))
  6. (nil (A B C D E F G))
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 19:06:17 | 显示全部楼层
@ymg和LM
 
对不起,我的不在主题范围内,这段代码只是平分。
只是为了分享,如果其他人看到这个相似的线程。
用opt T或nil按除法或长度拆分
  1. (defun split (lst len opt / ls l i) ; opt, T= by division or nil=by length
  2. (setq i 1 l '() len (if opt (/ (length lst) len) len))
  3. (while lst
  4.    (setq l (append  l (list(car lst))))
  5.    (if
  6.    (zerop (rem i len))
  7. (setq ls (cons l ls) l nil)
  8.    )
  9.    (setq i (1+ i) lst (cdr lst))
  10. ) ;_ end of foreach
  11. (if l
  12.    (append (reverse ls) (list  l))
  13.    (reverse ls)
  14. ) ;_ end of if
  15. ) ;_ end of defun

 
测试:
  1. (setq a '(1 2 3 4 5 6 7 8 9 0))
  2. ; split by division
  3. (split a 3 t)
  4. ;((1 2 3) (4 5 6) (7 8 9) (0))
  5. (split a 2 t)
  6. ;((1 2 3 4 5) (6 7 8 9 0))
  7. (split a 1 t)
  8. ;((1 2 3 4 5 6 7 8 9 0))
  9. ; split by length
  10. (split a 3 nil)
  11. ;((1 2 3) (4 5 6) (7 8 9) (0))
  12. (split a 2 nil)
  13. ;((1 2) (3 4) (5 6) (7  (9 0))
  14. (split a 1 nil)
  15. ;((1) (2) (3) (4) (5) (6) (7) ( (9) (0))

附言:代码标签字体小写“L”很像数字“1”,一眼就辨不出来?!
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 19:08:51 | 显示全部楼层
你好
 
有人能帮我解决我的问题吗?
例如,我有如下列表:
(a 12 3 4 a 5 6 7 8)
我想得到这样的东西:
((1 2 3 4) (5 6 7 8 ))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:15:44 | 显示全部楼层
 
程序员应该考虑什么标准才能得出这个结果?
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 19:17:09 | 显示全部楼层
我想用分隔符来划分列表。
 
更好的例子如下:
  1. 1) (setq mylist (list "sep" "a" "b" "c" "sep" "d" "e" "f")
  2. or
  3. 2) (setq mylist (list "a" "b" "c" "sep" "d" "e" "f")
  4. or
  5. 3) (setq mylist (list "a" "b" "c" "d" "e" "sep" "f")

现在我想写一个函数,用它通过分隔符分割mylist:
  1. (List_sep mylist "sep")

函数List_sep的预期结果:
  1. 1) (("a" "b" "c")("d" "e" "f"))
  2. or
  3. 2) (("a" "b" "c")("d" "e" "f"))
  4. or
  5. 3) (("a" "b" "c" "d" "e")("f"))

 
我写了lisp,但它不起作用:
  1. (defun LIST_sep (lista Sep / el res)
  2. (setq el "")
  3. (foreach % lista
  4.         (if (wcmatch % (strcat Sep "*"))
  5.                 (setq
  6.                         res (cons el res)
  7.                         el ""
  8.                 )
  9.                 (if (atom el)
  10.                         (setq el (cons % (list el)))
  11.                         (setq el (cons % el))
  12.                 )
  13.         )
  14. )
  15. (setq res (cons el res))
  16. (vl-remove "" res)
  17. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:22:47 | 显示全部楼层
试试这个:
 
  1. (defun _div:by:sep (lst sep / n f out all)
  2. ;; Tharwat 19.08.2015        ;;
  3. (setq n 0)
  4. (repeat (length lst)
  5.    (while (and (/= (setq f (nth n lst)) sep)
  6.                f
  7.                )
  8.      (setq out (append out (list f))
  9.            n   (1+ n)
  10.            )
  11.      )
  12.    (if out
  13.      (setq all (cons out all)
  14.            out nil
  15.            )
  16.      )
  17.    (setq n (1+ n))
  18.    )
  19. (reverse all)
  20. )
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 19:25:47 | 显示全部楼层
非常感谢。
我必须做出一些更改,lisp将在如下所示的情况下工作:
  1. (setq mylist (list "sepa" "a" "b" "c" "sepa" "d" "e" "f"))
  2. (_div:by:sep mylist "se")

结果:
  1. (("a" "b" "c")("d" "e" "f"))
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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