Page 1 of 1
anti-select elements of a list
Posted: Fri Dec 21, 2018 2:18 am
by lyl
The function "select" can be used to select multi-elements of a list at one time, for example:
->(1 2)
Yet what I want is to get all elements other than those "selceted", that is to say, I want to obtain (0 3 4) from above example.
I tried with the function "filter" like this:
Code: Select all
(filter (not (find $idx '(1 2))) '(0 1 2 3 4))
but it fails because "filter" does not support $idx.
So, is there a better way to anti-select elements in a list at one time by another list which assign positions those elements to be deleted?
Re: anti-select elements of a list
Posted: Fri Dec 21, 2018 10:37 am
by newBert
Here is a solution (probably not the only one, nor the best) :
Code: Select all
newLISP v.10.7.5 64-bit on Linux IPv4/6 UTF-8 libffi, options: newlisp -h
> (select '(0 1 2 3 4) (difference (index true? '(0 1 2 3 4)) '(1 2)))
(0 3 4)
> ;; maybe clearer:
>
(let (lst '(0 1 2 3 4))
(select lst (difference (index true? lst) '(1 2))))
(0 3 4)
>
Re: anti-select elements of a list
Posted: Fri Dec 21, 2018 2:45 pm
by lyl
newBert wrote:Here is a solution (probably not the only one, nor the best) :
Code: Select all
newLISP v.10.7.5 64-bit on Linux IPv4/6 UTF-8 libffi, options: newlisp -h
> (select '(0 1 2 3 4) (difference (index true? '(0 1 2 3 4)) '(1 2)))
(0 3 4)
> ;; maybe clearer:
>
(let (lst '(0 1 2 3 4))
(select lst (difference (index true? lst) '(1 2))))
(0 3 4)
>
If the lst contains nil(0 1 2 3 nil), how to do?
Re: anti-select elements of a list
Posted: Fri Dec 21, 2018 4:23 pm
by fdb
Code: Select all
(define (unselect lst sel)
(clean (fn(x) (member x sel)) lst))
(unselect '( 0 1 2 3 nil) '(1 2))
(0 3 nil)
Re: anti-select elements of a list
Posted: Fri Dec 21, 2018 4:39 pm
by fdb
or just
Code: Select all
(difference '(0 1 2 3 nil) '(1 2))
(0 3 nil)
or am I misunderstanding something?
Re: anti-select elements of a list
Posted: Sat Dec 22, 2018 1:18 am
by lyl
@fdb '(1 2) in my example means the position of elements in lst, not elements themselves. I think I give a poor example.
Re: anti-select elements of a list
Posted: Sat Dec 22, 2018 4:21 am
by ralph.ronnquist
So you might be looking for something like the following:
Code: Select all
(define (drop lst idx) (let (n -1) (clean (fn (x) (member (inc n) idx)) lst)))
> (drop '(5 4 3 2 1) '(1 2))
(5 2 1)
Re: anti-select elements of a list
Posted: Sat Dec 22, 2018 12:36 pm
by newBert
lyl wrote:newBert wrote:Here is a solution (probably not the only one, nor the best) :
Code: Select all
newLISP v.10.7.5 64-bit on Linux IPv4/6 UTF-8 libffi, options: newlisp -h
> (select '(0 1 2 3 4) (difference (index true? '(0 1 2 3 4)) '(1 2)))
(0 3 4)
> ;; maybe clearer:
>
(let (lst '(0 1 2 3 4))
(select lst (difference (index true? lst) '(1 2))))
(0 3 4)
>
If the lst contains nil(0 1 2 3 nil), how to do?
I replaced
0 1 2 3 4... with
a b c d e... for clarity.
Code: Select all
>
(let (lst '(a b c d nil f))
(select lst (difference (sequence 0 (- (length lst) 1)) '(1 2))))
(a d nil f)
>
Re: anti-select elements of a list
Posted: Sat Dec 22, 2018 12:38 pm
by fdb
or use select and the difference of the selected indexes:
Code: Select all
(define (unselect lst sel)
(select lst (difference (sequence 0 (dec (length lst))) sel)))
> (unselect '(5 4 3 2 1) '(1 2))
(5 2 1)
Re: anti-select elements of a list
Posted: Sat Dec 22, 2018 12:43 pm
by lyl
Many thanks all of you for these beautiful solutions!!