[Tutor] list comprehension with else

Steven D'Aprano steve at pearwood.info
Mon Jan 19 01:55:53 CET 2015


On Sun, Jan 18, 2015 at 02:20:55PM -0800, Danny Yoo wrote:
> Just to add, log(0) is mathematically undefined.
> https://en.m.wikipedia.org/wiki/Logarithm.

For the record, IEEE-754 specifies that log(0.0) should return -INF. 
That's what Decimal does:

py> from decimal import Decimal
py> Decimal(0).log10()
Decimal('-Infinity')


Alas, Python's math module only has partial support for the IEEE-754 
standard.

 
> So depending on the problem's context, it might be worth asking why log is
> being applied on this input.  Is such input expected?  Make sure the code
> isn't trying to correct for input that shouldn't be there in the first
> place.

Correct. Replacing too small values with 0.0 is the wrong solution. 
Using -INF is better, or a very large negative number. Otherwise, 
sticking 0 in the result is equivalent to replacing the negative values 
with 1.

data = [0.5, 1.0, 0.0]  # Good value, good value, bad value.
# This is the wrong way:
[0.0 if x == 0.0 else math.log(x) for x in data]
=> returns [-0.6931471805599453, 0.0, 0.0]

That is mathematically equivalent to x = 0.0 being replaced with x = 1.0 
before taking the log, and that makes no sense.

-- 
Steve


More information about the Tutor mailing list