找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3642|回复: 17

[群策群力] 移除列表的第n项,看看有多少条路!

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-24 08:47:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
大部份来自theswamp,大家玩个接龙!
  1. (defun removenth1 (ind lst)
  2.   (if (or
  3.         (zerop ind)
  4.         (null lst)
  5.       )
  6.     (cdr lst)
  7.     (cons (car lst) (removenth1 (1- ind) (cdr lst)))
  8.   )
  9. )
  10. (defun removenth2 (index lst / c)
  11.   (setq c -1)
  12.   (apply
  13.     'append
  14.     (mapcar
  15.       '(lambda (x)
  16.          (if (/= (setq c (1+ c))
  17.                  index
  18.              )
  19.            (list x)
  20.          )
  21.        )
  22.       lst
  23.     )
  24.   )
  25. )
  26. (defun removenth3 (n lst / j)
  27.   (setq j -1)
  28.   (vl-remove-if '(lambda (x)
  29.                    (= n (setq j (1+ j)))
  30.                  ) lst
  31.   )
  32. )
  33. (defun removenth4 (n lst / len foo i)
  34.   (defun foo (x)
  35.     (if (eq n (setq i (1+ i)))
  36.       (defun foo (x)
  37.         nil
  38.       )
  39.     )
  40.   )
  41.   (cond
  42.     ((zerop n)
  43.       (cdr lst)
  44.     )
  45.     ((eq n (1- (setq len (length lst))))
  46.       (reverse (cdr (reverse lst)))
  47.     )
  48.     ((< (setq i -1)
  49.         n len
  50.      )
  51.       (vl-remove-if 'foo lst)
  52.     )
  53.     (lst)
  54.   )
  55. )
  56. (defun removenth5 (idx lst / nlst cnt)
  57.   (setq cnt 0)
  58.   (foreach elem lst
  59.     (if (/= cnt idx)
  60.       (setq nlst (cons elem nlst))
  61.     )
  62.     (setq cnt (1+ cnt))
  63.   )
  64.   (reverse nlst)
  65. )
  66. (defun removenth6 (n lst / lngth newlst)
  67.   (setq lngth -1)
  68.   (repeat (length lst)
  69.     (setq lngth (+ lngth 1))
  70.     (if (not (= lngth n))
  71.       (setq newlst (append
  72.                      newlst
  73.                      (list (nth lngth lst))
  74.                    )
  75.       )
  76.     )
  77.   )
  78.   newlst
  79. )
  80. (defun removenth7 (n l / a)
  81.   (while (and
  82.            l
  83.            (> n 0)
  84.          )
  85.     (setq a (cons (car l) a)
  86.           l (cdr l)
  87.           n (1- n)
  88.     )
  89.   )
  90.   (append
  91.     (reverse a)
  92.     (cdr l)
  93.   )
  94. )
  95. (defun removenth8 (ndx lst / count newlist)
  96.   (setq count 0)
  97.   (repeat (length lst)
  98.     (if (/= count ndx)
  99.       (setq newlist (append
  100.                       newlist
  101.                       (list (car lst))
  102.                     )
  103.       )
  104.     )
  105.     (setq lst (cdr lst)
  106.           count (1+ count)
  107.     )
  108.   )
  109.   newlist
  110. )
  111. (defun removenth9 (i lst / tmp)
  112.   (if (and
  113.         i
  114.         (vl-consp lst)
  115.         (not (minusp i))
  116.       )
  117.     (progn
  118.       (repeat (min
  119.                 i
  120.                 (length lst)
  121.               )
  122.         (setq tmp (cons (car lst) tmp)
  123.               lst (cdr lst)
  124.         )
  125.       )
  126.       (append
  127.         (reverse tmp)
  128.         (cdr lst)
  129.       )
  130.     )
  131.     lst
  132.   )
  133. )
  134. (defun removenth10 (ndx lst)
  135.   (append
  136.     (reverse (cdr (member (nth ndx lst) (reverse lst))))
  137.     (cdr (member (nth ndx lst) lst))
  138.   )
  139. )
  140. (defun removenth11 (i lst / a b)
  141.   (cond
  142.     ((> i (length lst))
  143.       lst
  144.     )
  145.     ((setq a lst
  146.            b (reverse lst)
  147.      )
  148.       (append
  149.         (reverse (repeat (- (length b) i)
  150.                    (setq b (cdr b))
  151.                  )
  152.         )
  153.         (repeat (1+ i)
  154.           (setq a (cdr a))
  155.         )
  156.       )
  157.     )
  158.   )
  159. )
  160. (defun removenth12 (e l)
  161.   (apply
  162.     'append
  163.     (subst
  164.       nil
  165.       (list (nth e l))
  166.       (mapcar
  167.         'list
  168.         l
  169.       )
  170.     )
  171.   )
  172. )

评分

参与人数 1D豆 +6 收起 理由
XDSoft + 6 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2008-12-24 20:07:17 | 显示全部楼层
移除第n项又如何写?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 20:14:01 | 显示全部楼层

Re: [分享]:移除列表的第n项,看看有多少条路!

最初由 taner 发布
[B]大部份来自theswamp,大家玩个接龙!

[CODE]
  
(defun removenth1 (ind lst)
  (if (or
        (zerop ind)
        (null lst)
      )
    (cdr lst)
    (cons (car lst) (removenth1 (1- ind) (... [/B]



咋接阿,该有的方法你那里都写了吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2009-1-5 23:27:01 | 显示全部楼层
我肯定用removenth3

以前好像都是apply 'append   list... nil ..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2009-1-6 09:04:53 | 显示全部楼层
俺是这样写的

  1. (defun ybl-lst-removenth (n lst / ll)
  2.   (repeat n
  3.     (setq ll  (cons (car lst) ll)
  4.           lst (cdr lst)
  5.     )
  6.   )
  7.   (append (reverse ll) (cdr lst))
  8. )

再扩展下

  1. (defun ybl-lst-removenth (n lst / ll m)
  2.   (if (= (type n) 'INT)
  3.     (progn
  4.       (repeat n
  5.         (setq ll  (cons (car lst) ll)
  6.               lst (cdr lst)
  7.         )
  8.       )
  9.       (append (reverse ll) (cdr lst))
  10.     )
  11.     (progn
  12.       (setq m -1)
  13.       (vl-remove "ea-nil"
  14.                  (mapcar '(lambda (x)
  15.                             (setq m (1+ m))
  16.                             (if        (member m n)
  17.                               "ea-nil"
  18.                               x
  19.                             )
  20.                           )
  21.                          lst
  22.                  )
  23.       )
  24.     )
  25.   )
  26. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2009-1-6 09:43:47 | 显示全部楼层
速度比较

  1. _$ lst
  2. (1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 9)
  3. _$ (benchmark '((removenth1 10 lst) (removenth2 10 lst)
  4.             (removenth3 10 lst)
  5.             (removenth4 10 lst)
  6.             (removenth5 10 lst)
  7.             (removenth6 10 lst)
  8.             (removenth7 10 lst)
  9.             (removenth8 10 lst)
  10.             (removenth9 10 lst)
  11.             (removenth10 10 lst)
  12.             (removenth11 10 lst)
  13.             (removenth12 10 lst)
  14.             (ybl-lst-removenth 10 lst)
  15.            )
  16. )
  17. Benchmarking ................Elapsed milliseconds / relative speed for 8192 iteration(s):

  18.     (REMOVENTH1 10 LST)............1844 / 2.88 <fastest>
  19.     (REMOVENTH7 10 LST)............1969 / 2.7
  20.     (REMOVENTH5 10 LST)............2187 / 2.43
  21.     (REMOVENTH9 10 LST)............2234 / 2.38
  22.     (REMOVENTH4 10 LST)............2360 / 2.25
  23.     (YBL-LST-REMOVENTH 10 LST).....2969 / 1.79
  24.     (REMOVENTH2 10 LST)............3015 / 1.76
  25.     (REMOVENTH11 10 LST)...........3266 / 1.63
  26.     (REMOVENTH6 10 LST)............3859 / 1.38
  27.     (REMOVENTH10 10 LST)...........4219 / 1.26
  28.     (REMOVENTH8 10 LST)............4328 / 1.23
  29.     (REMOVENTH3 10 LST)............4750 / 1.12
  30.     (REMOVENTH12 10 LST)...........5312 / 1 <slowest>
  31. _$
  32.   [/FONT]
复制代码
俺也扩展一个:

  1.   [FONT=courier new]
  2. (defun th-remove-nlst (nlst lst / i)
  3.   (cond
  4.     ((= (type nlst) 'int)
  5.       (setq i -1)
  6.       (vl-remove-if '(lambda (x)
  7.                        (= nlst (setq i (1+ i)))
  8.                      ) lst
  9.       )
  10.     )
  11.     ((= (type nlst) 'list)
  12.       (setq i -1)
  13.       (vl-remove-if '(lambda (x)
  14.                        (vl-position (setq i (1+ i))
  15.                                     nlst
  16.                        )
  17.                      ) lst
  18.       )
  19.     )
  20.     (t
  21.       lst
  22.     )
  23.   )
  24. )
  25.   [/FONT]
测试速度:

  1.   [FONT=courier new]
  2. _$ lst
  3. (1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 9)
  4. _$ (benchmark '((ybl-lst-removenth '(1 3 5 7 9) lst) (th-remove-nlst '
  5.                                                                   (1 3 5 7 9)
  6.                                                                   lst
  7.                                                   )
  8.            )
  9. )
  10. Benchmarking ...............Elapsed milliseconds / relative speed for 4096 iteration(s):

  11.     (YBL-LST-REMOVENTH (QUOTE (1 3 5 7 9...).....1765 / 1.55 <fastest>
  12.     (TH-REMOVE-NLST (QUOTE (1 3 5 7 9)) ...).....2734 / 1 <slowest>
  13. _$
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-1-6 12:27:53 | 显示全部楼层
subst 是有缺陷的不能用,会替换掉值相同的项的

(removenth12 3 '(0 2 1 2 3 4))
-> (0 1 3 4)
正确的应该返回->(0 2 1 3 4)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2009-1-6 13:09:54 | 显示全部楼层
刀,你到底有几个户头?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-1-7 13:15:32 | 显示全部楼层
是最近找回来的户头。
我的个人点评:
排除不完善的程序
removenth1,removenth10 ,ybl-lst-removenth
效率较高,构思也比较巧妙
这几个程序都用了一条:一找到目标,余下的部分就 cdr
因此效率比mapcar等要高,尤其是 n 是比较靠前的时候,优势更明显。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2009-1-7 14:16:28 | 显示全部楼层
member 对有相同元素的表可能返回不正确


  1. _$ (setq lst  '(1 2 3 0 1 2 3 0 1 2 3))
  2. (1 2 3 0 1 2 3 0 1 2 3)
  3. _$ (nth 8 lst)
  4. 1
  5. _$ (nth 7 lst)
  6. 0
  7. _$ (member (nth 7 lst) lst)
  8. (0 1 2 3 0 1 2 3)
  9. _$


处于表的后半部,如果减少 repeat 次数就要用 Reverse 一次,不知道哪个更快
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-1-7 23:42:51 | 显示全部楼层
member效率不见得高(估计)
因为要做一些额外的处理,且member实际就是逐个判断的过程
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-8 17:23:06 | 显示全部楼层
;函数内容:
  1. (defun listdel (lst k / i lst2)

  2.   (if (= lst nil) ;IF 1
  3.     (exits "函数listdel中LST为空。 ")
  4.     (progn ;p1
  5.       (if (/= (type lst) 'LIST)
  6.         (exits "函数listdel中参数LST不是表。")
  7.       )
  8.       (if (/= (type k) 'INT)
  9.         (exits "函数listdel中参数LST不是整数。")
  10.       )
  11.       (setq len (length lst))
  12.       (if (< k 1)
  13.         (exits "函数listdel中参数K值小于1,应为大于等于1 。")
  14.       )
  15.       (if (> k len)
  16.         (exits "函数listdel中参数K值大于LST表长度。")
  17.       )


  18.       (setq i (- len 1))
  19.       (setq lst2 nil)
  20.       (while (>= i (- k 0))
  21.         (progn
  22.           (setq lst2 (cons (nth i lst) lst2))
  23.           (setq i (- i 1))
  24.         )
  25.       )
  26. ;;;      (setq lst2 (cons ent lst2))
  27.       (setq i (- k 2))
  28.       (while (>= i 0)
  29.         (progn
  30.           (setq lst2 (cons (nth i lst) lst2))
  31.           (setq i (- i 1))
  32.         )
  33.       )
  34.       (setq lst2 lst2)
  35.     ) ;end p1
  36.   ) ;end if1
  37. )
  38. ;end listdel

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2009-2-25 00:55:13 | 显示全部楼层

  1. (defun remove-n (n lst / a b)
  2.   (setq a lst)
  3.   (repeat n
  4.     (setq b (cons (car a) b))
  5.     (setq a (cdr a))
  6.   )
  7.   (setq a (cdr a))
  8.   (foreach i b
  9.     (setq a (cons i a))
  10.   )
  11. a
  12. )



很久没上这个网站了,我也来凑个热闹。
顺便说一句,只用改一句,这个函数就可以变成在n处插入一个元素。


  1. (defun insert-n (n element lst / a b)
  2.   (setq a lst)
  3.   (repeat n
  4.     (setq b (cons (car a) b)
  5.             a (cdr a)
  6.     )
  7.   )
  8.   (setq a (cons element a))
  9.   (foreach i b
  10.     (setq a (cons i a))
  11.   )
  12. a
  13. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2009-2-25 08:18:34 | 显示全部楼层
再加3個

  1. (defun addnth1 (lst pos val / lst1 lst2 cnt nverts)
  2.   (setq cnt 0
  3.         lst1 '()
  4.         nverts (length lst)
  5.   )
  6.   (repeat pos
  7.     (setq lst1 (cons (nth cnt lst) lst1)
  8.           cnt (1+ cnt)
  9.     )
  10.   )
  11.   (setq lst1 (cons val lst1)
  12.         lst1 (reverse lst1)
  13.         cnt pos
  14.   )
  15.   (if (> nverts pos)
  16.     (progn
  17.       (setq lst2 '())
  18.       (repeat (- nverts pos)
  19.         (setq lst2 (cons (nth cnt lst) lst2)
  20.               cnt (1+ cnt)
  21.         )
  22.       )
  23.       (setq lst2 (reverse lst2)
  24.             lst1 (append
  25.                    lst1
  26.                    lst2
  27.                  )
  28.       )
  29.     )
  30.   )
  31.   lst1
  32. )
  33. (defun addnth2 (lst pos new / lst2)
  34.   (setq pos (1+ pos))
  35.   (mapcar
  36.     '(lambda (x)
  37.        (if (zerop (setq pos (1- pos)))
  38.          (setq lst2 (cons new lst2)
  39.                lst2 (cons x lst2)
  40.          )
  41.          (setq lst2 (cons x lst2))
  42.        )
  43.      )
  44.     lst
  45.   )
  46.   (reverse lst2)
  47. )
  48. (defun addnth3 (lst pos new / n)
  49.   (setq n -1)
  50.   (apply
  51.     'append
  52.     (mapcar
  53.       (function (lambda (x)
  54.                   (if (= (setq n (1+ n))
  55.                          pos
  56.                       )
  57.                     (list new x)
  58.                     (list x)
  59.                   )
  60.                 )
  61.       )
  62.       lst
  63.     )
  64.   )
  65. )
將上面的改一下

  1. (defun addnth4 (lst n element / a b)
  2.   (setq a lst)
  3.   (repeat n
  4.     (setq b (cons (car a) b)
  5.           a (cdr a)
  6.     )
  7.   )
  8.   (setq a (cons element a))
  9.   (foreach i b
  10.     (setq a (cons i a))
  11.   )
  12. )
  13.   [/FONT]
測試

  1. $ lst
  2. (9 8 7 6 5 4 3 2 1 0)
  3. _$ (benchmark '((addnth1 lst 5 "a") (addnth2 lst 5 "a")
  4.             (addnth3 lst 5 "a")
  5.             (addnth4 lst 5 "a")
  6.            )
  7. )
  8. Benchmarking ...............Elapsed milliseconds / relative speed for 4096 iteration(s):

  9.     (ADDNTH4 LST 5 "a").....1047 / 1.45 <fastest>
  10.     (ADDNTH1 LST 5 "a").....1125 / 1.35
  11.     (ADDNTH2 LST 5 "a").....1172 / 1.29
  12.     (ADDNTH3 LST 5 "a").....1516 / 1.00 <slowest>
  13. _$
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3191个

财富等级: 富可敌国

发表于 2013-6-12 13:46:27 | 显示全部楼层
大侠们太厉害了,值得学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 11:18 , Processed in 0.240533 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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