TransWikia.com

Removing certain numbers from a list

Mathematica Asked on April 4, 2021

If I have an list of numbers {1, 2, 4, 70, 11, 20, 56, 79}, is there a way to remove the list {2, 4, 56} from that list?

In my application, the lists are way bigger, so I am looking for a general way of removing a list of numbers from the original list.

My thoughts were to use the following code: DeleteCases[{1, 2, 4, 70, 11, 20, 56, 79}, {2, 4, 56}] but that didn’t work, because the output must be {1, 70, 11, 20, 79} and it isn’t.

One Answer

There are three main ways of deleting members in such cases :

  1. As Daniel said , you could try DeleteCases supplementing a pattern which picks up just the numbers which are element of another list. The pattern is like this :

as what Daniel said :

a_ /; MemberQ[{2,4,56},a]

or :

a_?(MemberQ[{2, 4, 56}, #] &)

Now you could use each one of the above patterns in DeleteCases. Thus we have :

DeleteCases[{1, 2, 4, 70, 11, 20, 56, 79} , a_ /; MemberQ[{2,4,56},a])]

or :

DeleteCases[{1, 2, 4, 70, 11, 20, 56, 79} , a_?(MemberQ[{2, 4, 56}, #] &)]
  1. But there is even a simpler way of deleting cases which could be tried.

This is a sample :

{1, 2, 4, 70, 11, 20, 56, 79} /. a_ /; MemberQ[{2, 4, 56}, a] -> Nothing

In this way we could just convert any instance matching your pattern to Nothing ! ( Converting THING to NOTHING. isn't better?! )

  1. And even simpler :

Just using Complement :

Complement[{1, 2, 4, 70, 11, 20, 56, 79}, {2, 4, 56}]

BE CAUTIONED !! Using each one of the mentioned ways WILL NOT take the same (asymptotically) time to evaluate.

Just for representation , we could compare these two ways in list with length of 10^6 :

For the first route :

AbsoluteTiming[
  Table[DeleteCases[Range[10^6], 
     a_?(MemberQ[RandomInteger[10^6, 100], #] &)];, 5]] // First

which gives me 124.474 (means 124 seconds).

And for the second way:

AbsoluteTiming[
  Table[Range[10^6] /. 
     a_ /; MemberQ[RandomInteger[10^6, 100], a] -> Nothing;, 
   5]] // First

Which gives me 124.8 (means 124 seconds).

While the third way :

AbsoluteTiming[
  Table[Complement[Range[10^6], RandomInteger[10^6, 100]];, 
   5]] // First

just take 0.15 (means 0.15 seconds) !!

Compare those : 124 sec, 124 sec , 0.15 sec

So the best way is the third way especially for larger Lists ! :)

Correct answer by Hossein Hadi on April 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP