4
$\begingroup$

I need to create a new list from a nested list but using the evaluation as criteria to drop the elements. For example let's say that that I have the following list:

list1={{1,1,-(-1)^3,x,2*x},{1,1,(-1)^3,x,2*x},
       {1,1,x,2*x,3*x},{1,1,-x,-2*x,-3*x}}

and I need to eliminate the elements of list1 that the absolute value of the third element give $1$, i.d. $-(-1)^3$ and $(-1)^3$, to obtain

 list2={{1,1,x,2*x,3*x},{1,1,-x,-2*x,-3*x}}

In this case, list1 was created with the code

For[i = 1, i < 4, i++,
    For[j = 1, j < 4, j++,  
  list1[i, j, p_] = Sort[Eigenvalues[mat[i, j, p]]];
  ]  ]

I have been trying to use Select but until now I am not been able to create list2 to plot it with

list2=ParallelTable[Select[Abs[eigval[i, j, p][[3]]], 
                       Abs[#] != 1 &] , {i, 1, 4}, {j,1,4}]

I am still learning to uses cases in Mathematica so I am not sure how to do it. Do you know if there is wise way to do it? Thanks in advance.

$\endgroup$
7
$\begingroup$

If you prefer using DeleteCases,

list2 = DeleteCases[list1, _?(Abs[#[[3]]] == 1 &)]

{{1, 1, x, 2 x, 3 x}, {1, 1, -x, -2 x, -3 x}}

$\endgroup$
5
$\begingroup$
Delete[
 list1, 
 Position[Abs[list1[[All, 3]]], 1]
 ]

{{1, 1, x, 2 x, 3 x}, {1, 1, -x, -2 x, -3 x}}

$\endgroup$
5
$\begingroup$

if you want to use Select, try this

Select[list1,!NumberQ@#[[3]]||Abs[#[[3]]]!=1&]    

{{1, 1, x, 2 x, 3 x}, {1, 1, -x, -2 x, -3 x}}

$\endgroup$
1
$\begingroup$

This is pretty efficient on unpacked arrays (the Listable attribute assumes list1[[All, 3]] is a flat list, as it is in the OP's example):

Block[{signal},
 SetAttributes[signal, Listable];
 signal[1] = 1; signal[_] = 0;
 Pick[list1, signal@Abs[list1[[All, 3]]], 0]
 ]
(*  {{1, 1, x, 2 x, 3 x}, {1, 1, -x, -2 x, -3 x}}  *)

(For packed arrays, one would probably want to use Unitize[x-1] instead of signal.)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.