[Tutor] list comprehension with else
Alan Gauld
alan.gauld at btinternet.com
Sun Jan 18 16:49:49 CET 2015
On 18/01/15 13:20, Sydney Shall wrote:
> The problem is I am occasionally getting exactly zeros when I need to
> obtain the logarithm of the number.
>
> for i in range(len(cap)):
Its usually better to iterate over the collection rather than use indexing:
for item in cap:
> if cap[i] == 0.0:
Its usually a bad idea to compare floats for equality. It's better to
define a small limit value and check if they are within the range.
like this
e = 0.0000000001 # or whatever
if val-e <= cap[[i] <= val+e:
do something.
In your case where you test against zero it simplifies to
if -e < cap[i] < e:
do something
> tmp = math.log(1.0)
log(1) is a constant (0) so you might as well just say
> lncap.append(tmp)
lncap.append(0.0)
> else:
> lncap.append(math.log(cap[i]))
But won't this cause you to have really dodgy results? How do you
distinguish genuine log(1) values from your pseudo log(0) values?
Or does it not matter?
> I have set mu options to plain text.
Thanks, always appreciated.
While you can make comprehensions do what you want its not always a good
idea. Sometimes its better to revert to explicit loops if the complexity
of the comprehension gets too great.
But in your case its fairly simple to use a conditional expression:
lncap = [ 0.0 if (-e < item < e) else math.log(item) for item in cap]
HTH
--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos
More information about the Tutor
mailing list