palewire wrote:
In my application, I'd like to have a function that compares two values,
either of which may be null, and then classify the result depending on
whether one is higher or lower than the other.

I find myself writing something clunky like this, and I'm curious whether
anyone might know a more elegant way for parsing this out.

def compare(a, b):
    if not a and not b:
        return "No data"
    else:
        if a == 0 and b == 0:
            return "Never had"
        else:
            if a == b:
                return "Stayed the same"
            elif a < b:
                return "Gained"
            elif a > b and b > 0:
                return "Lost Some"
            elif a > b and b == 0:
                return "Lost All"

If there's some obvious way to search for this solution online, feel free to
slap me with that. I tried digging around on Google and couldn't come up
with much.

Thanks much.
Before one can "optimize" a function, one needs to get the function correct. Looks to me that if a and b are both zero, it'll say "No data" and never get to the "Never had" test. And if a is positive and b is None, it'll return None, rather than any string.

Anyway, any "optimized" construct is going to be nearly as big as this. You'd have to define a list of strings, and then compute an index value that gave you the appropriate value. While I could probably come up with such, I hardly think it's worthwhile. The cases are confusing enough to me that I'd not want to make the code any less readable by some formula & lookup.

That brings us to the question of what is more elegant. To me the elegant code is readable first, and efficient (space & time) second. I suspect efficiency would be nearly optimal by careful ordering of the nested ifs. Find the most likely cases, and test for them first.

If this is a programming puzzle, for entertainment purposes, here's the way I'd tackle making it "efficient" obfuscated code. Start by checking if either value is None. Something like:

table = ("Lost Some","Lost All","Gained","Gained","Stayed the same","Never had, never will")
def compare2(a,b):
   global table
   if a is None or b is None:
       return "Invalid data"
   return table[4*(a==b)+2*(a<b)+(b==0)]

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

Reply via email to