明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3457|回复: 10

如何删除表中某个位置的元素

[复制链接]
发表于 2006-12-27 22:05:00 | 显示全部楼层 |阅读模式

怎么删除表中某个索引位置的元素?
比如表(1 2 3 4 ) 要删除index为1的元素

发表于 2006-12-27 23:16:00 | 显示全部楼层

一个较笨的办法

用nth查找出来后用cons加到另外一个表中

如果你想删除第2个,循环时候就去要第2个就可以了

发表于 2006-12-28 08:20:00 | 显示全部楼层
;| (xl-subi lst ilst nlst)---------作  者: 狂刀 [http://www.xdcad.net/]
功  能   : 表中指定位置插入新元素或删除指定位置元素
参  数   : lst = 表 ;
           ilst = 索引值或索引值表;
           nlst = 插入的元素或对应索引值表数量的插入元素表,nil 时为删除;
返回值   : 成功返回新表,否则返回原表;
注  意   : 1 插入/删除位置为相对原表的位置,从 0 计数;
实 例  :
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 0) ) ;;->(1 0 2 3 4 0 5 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 nil)) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 )) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) nil);;->(1 3 4 6)
(xl-subi '(1 2 3 4 5 6)  2 0);;->(1 2 0 3 4 5 6)
(xl-subi '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
|;
(defun xl-subi (lst ilst nlst / i a) ;; by 狂刀.2005.8
(if (/= 'LIST (type ilst))(setq ilst (list ilst)))
(if (/= 'LIST (type nlst))(setq nlst (list nlst)))
(apply 'append (mapcar '(lambda(x)
  (setq i (if i (1+ i) 0))
  (if (= (car ilst) i)
    (progn
      (setq ilst (cdr ilst)
    a    (car nlst)
    nlst (cdr nlst))
      (if a (list a x)nil)
     )
    (list x)
   )
  )
       lst)
)
)
 楼主| 发表于 2006-12-28 18:23:00 | 显示全部楼层
多谢BBO的转贴 !!!
发表于 2006-12-28 21:34:00 | 显示全部楼层

今天也做了一个,不如狂刀的好

既然做了,就发上来吧

(defun c:jj()
(setq a (getint "\n 请输入要去掉的位置序号:"))
(if (/= d nil)
(setq d nil))
(setq b  '(1 2 3 4 5 6))
(setq len (vl-list-length b))
(setq n 0)
(repeat len
(if (and (< n len) (/= n (- a 1)))
(progn
(setq c (nth n b))
(setq d (cons c d))
)   ;end progn
(princ)
)  ;end if
(setq n (+ 1 n))
)  ;end repeat
(princ "\n")
(reverse d)
)

发表于 2006-12-28 23:38:00 | 显示全部楼层
我觉得还是用vl-remove方便,如果你知道表中要删除的元素,直接用[vl-remove 元素 列表],如果不知道,可以先用nth函数返回某个位置元素的值,然后再用vl-remove
发表于 2006-12-29 22:11:00 | 显示全部楼层

但是楼上那样有一个缺陷的

如果表中有若干个一样的元素,就都会被删除的

发表于 2006-12-29 22:32:00 | 显示全部楼层
本帖最后由 作者 于 2006-12-29 22:33:33 编辑

简单的可以这样
  1. (defun xl-d (lst n)
  2. (setq i -1)
  3. (apply 'append(mapcar '(lambda(x)(if (= n (setq i(1+ i)))  nil (list x)))lst))
  4. )
发表于 2006-12-30 12:32:00 | 显示全部楼层

直接用(vl-remove index list)不行吗?

如果INDEX未知的话,用(vl-remove (vl-position symbol list) list).

发表于 2006-12-30 13:16:00 | 显示全部楼层

(vl-remove '2 '(2 3 2 4))

相同的都会被去除

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

本版积分规则

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

GMT+8, 2025-11-23 11:32 , Processed in 0.191916 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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