On Jul 15, 2009, at 12:07 AM, Dr. Phillip M. Feldman wrote:

I appreciate the effort that people have made, but I'm not impressed with any of the answers. For one thing, xor should be able to accept an arbitrary
number of input arguments (not just two)

You originally proposed this in the context of the existing short- circuit boolean operators. Those operators (being infix) take only two operands.

and should return True if and only
if the number of input arguments that evaluate to True is odd

The existing and/or operators always return the value of one of the operands--not necessarily True or False--which is another important property, but one that can't be translated fully to xor. Given the lack of context in your original post, hopefully you'll forgive me being unimpressed by your not being impressed. :)

Here's my code:

def xor(*args):
"""xor accepts an arbitrary number of input arguments, returning True if and only if bool() evaluates to True for an odd number of the input
  arguments."""

  result= False

  for arg in args:
     if bool(arg): result= not result

  return result

If all you want is a True or False result, I'd write it like this:

import operator
def xor(*args):
    return reduce(operator.xor, map(bool, args)) # or imap

In order to make it act more like the other logical operators, I'd use MRAB's 2-argument xor as the reducer--though I can't really see the utility.

def xor2(a, b):
    return (not b and a) or (not a and b)

def xor(*args):
    return reduce(xor2, args)

You may also find this question interesting:

http://stackoverflow.com/questions/432842/

-Miles

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to