Re: "short circuiting" And and Or
- To: mathgroup at smc.vnet.net
- Subject: [mg70594] Re: "short circuiting" And and Or
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 21 Oct 2006 05:13:24 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <eha5b7$b5b$1@smc.vnet.net>
Szabolcs Horvat wrote: > I'd like to write a function that tests whether there are any elements > in a list that violate a certain condition. I could simply use > And@@condition/@list, but for reasons of efficiency I'd like to stop > the testing as soon as a "False" value is found. Is there any elegant > way of doing this without writing an explicit While loop? > > Szabolcs Horvát > Say we have some lists of integers and we want to check that the lists contain only positive integers less or equal to ten. We can use the built-in function Select with the logical tests written as an anonymous function. Also, we set the last parameter of Select to one in order to stop searching the list at the first occurrence where the conditions do not hold. If the list returned by Select is empty, we conclude that the conditions hold for every elements of the original list. In[1]:= list1={5,2,-3,0,2,7,10,3,3,2,3,6,10,8,8,7,9,4,8,3}; list2={5,2,3,1,2,7,10,3,3,2,3,6,10,8,8,7,9,4,8,3}; violateConditionsQ[data_List,cond_]:= If[Length[Select[data,cond,1]]>0,True,False] In[4]:= violateConditionsQ[list1,(#<=0||#>10)&] Out[4]= True In[5]:= violateConditionsQ[list2,(#<=0||#>10)&] Out[5]= False Regards, Jean-Marc