Re: Identical elements
- To: mathgroup at smc.vnet.net
- Subject: [mg88429] Re: Identical elements
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Mon, 5 May 2008 06:13:10 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <fvhe2h$3th$1@smc.vnet.net> <481C861E.8020808@gmail.com>
Jean-Marc Gulliet wrote:
> KFUPM wrote:
>
>> I have a list and i need to test whether all the elements in the list
>> are identical or no. What is the efficient way to do that? The output
>> should be true if all elements are the same and False otherwise. One
>> line command is preferred if possible.
>>
>> Your help is highly appreciated.
>
> A possible approach, thought you did precise neither the type of the
> elements of the list (numeric, symbolic, mixed,...) nor whether the list
> could contains some other lists, is the following. We test each
> remaining element of the list against the first element and return False
> as soon as an element differs from the first one.
>
>
> myCheck[lst_List] :=
> Module[{fe = First@lst, status = True},
> Scan[If[# != fe, Return[status = False]] &, Rest@lst]; status]
>
> myCheck[{1, 1, 1, 1}]
> myCheck[{1, 1, -1, 1}]
> myCheck[{{1, 2}, {1, 2}, {1, 2}, {1, 2}}]
> myCheck[{{1, 2}, {1, 2}, {-1, 2}, {1, 2}}]
>
> True
>
> False
>
> True
>
> False
A simpler and faster solution is to use *Equal* to test equality of the
list against itself slightly rotated. For instance,
In[1]:= lst = Join[{0.}, ConstantArray[1., {10^7}]];
Timing[lst == RotateLeft@lst]
Out[2]= {0.137857, False}
In[3]:= lst = Join[{1.}, ConstantArray[1., {10^7}]];
Timing[lst == RotateLeft@lst]
Out[4]= {0.191334, True}
Best regards,
-- Jean-Marc