446,190 Members | 802 Online
Need help? Post your question and get tips & solutions from a community of 446,190 IT Pros & Developers. It's quick & easy.

"and" and "or" on every item in a list

 P: n/a Is this the best way to test every item in a list? def alltrue(f,l): return reduce(bool.__and__,map(f,l)) def onetrue(f,l): return reduce(bool.__or__,map(f,l)) >>alltrue(lambda x:x>1,[1,2,3]) False >>>alltrue(lambda x:x>=1,[1,2,3]) True >>> Thanks Oct 29 '07 #1
7 Replies

 P: n/a On Oct 29, 3:57 pm, GHZ alltrue(lambda x:x>1,[1,2,3]) False >alltrue(lambda x:x>=1,[1,2,3]) True In Py2.5, you can use the builtin any() and all() functions. In Py2.4, use the recipes from the itertools module: def all(seq, pred=None): "Returns True if pred(x) is true for every element in the iterable" for elem in ifilterfalse(pred, seq): return False return True def any(seq, pred=None): "Returns True if pred(x) is true for at least one element in the iterable" for elem in ifilter(pred, seq): return True return False def no(seq, pred=None): "Returns True if pred(x) is false for every element in the iterable" for elem in ifilter(pred, seq): return False return True Raymond Oct 29 '07 #2

 P: n/a On Oct 29, 3:57 pm, GHZ alltrue(lambda x:x>1,[1,2,3]) False >alltrue(lambda x:x>=1,[1,2,3]) True Thanks If you are using python 2.5 the best way would be something like this: >>all(x 1 for x in [1,2,3]) False >>any(x 1 for x in [1,2,3]) True If you are using an earlier version you are still discouraged from using reduce in place of a more readable construct. In most cases list comprehension is encouraged over map also. If `all' and `any' aren't defined you can use something like the following. One advantage of these over what you posted is that they will return as soon as an exit condition is reached as opposed to processing the entire list. Expand|Select|Wrap|Line Numbers if not all: def all(seq): for val in seq: if not val: return False return True   if not any: def any(seq): for val in seq: if val: return True return False   Matt Oct 29 '07 #3

 P: n/a On Oct 29, 6:57 pm, GHZ

 P: n/a On Oct 29, 10:57 pm, GHZ

 P: n/a Is this the best way to test every item in a list? > def alltrue(f,l): return reduce(bool.__and__,map(f,l)) def onetrue(f,l): return reduce(bool.__or__,map(f,l)) >>>alltrue(lambda x:x>1,[1,2,3]) False >>>alltrue(lambda x:x>=1,[1,2,3]) True As of Python2.5, there's an any() and all() function built into the language. >>any(map(lambda x: x>1, [1,2,3]))all(map(lambda x: x>1, [1,2,3])) Implementations for older versions are given at http://docs.python.org/lib/built-in-funcs.html You can adjust the "if" test in the example code so that it calls your function...something like def my_any(f, iterable): for element in iterable: if f(element): return True return False def my_all(f, iterable): for element in iterable: if not f(element): return False return True The advantage of the code in the docs is that it short-circuits...there's no need to reduce the entire list if an early item triggers the condition (a "true" early in an "any" or a "false" early in an "all"). While you can use a reduce(bool.__and__, thing) call, I more frequently see it as reduce(operator.or_, thing) Just a few ideas, -tkc Oct 29 '07 #6

 P: n/a On Oct 29, 5:57 pm, GHZ alltrue(lambda x:x>1,[1,2,3]) False >>all(x>1 for x in [1,2,3]) False >alltrue(lambda x:x>=1,[1,2,3]) True >>all(x>=1 for x in [1,2,3]) True Thanks HTH Oct 30 '07 #7

 P: n/a Thanks for the answers, I suspected something like any(), all() existed. Also got me thinking about generator expressions, my code is full of list comprehensions for lists I don't keep. Oct 30 '07 #8