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