osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Test 0 and false since false is 0


On Friday, 7 July 2017 12:46:51 UTC+10, Rick Johnson  wrote:
> On Thursday, July 6, 2017 at 9:29:29 PM UTC-5, Sayth Renshaw wrote:
> > I was trying to solve a problem and cannot determine how to filter 0's but not false.
> > 
> > Given a list like this
> > ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
> > 
> > I want to be able to return this list
> > ["a","b",None,"c","d",1,False,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0]
> > 
> > However if I filter like this 
> > 
> > def move_zeros(array):
> >     l1 = [v for v in array if v != 0]
> >     l2 = [v for v in array if v == 0]
> >     return l1 + l2
> > 
> > I get this 
> > ['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, False, 0, 0, 0, 0, 0, 0, 0] 
> > 
> > I have tried or conditions of v == False etc but then the 0's being false also aren't moved. How can you check this at once?
> 
> Yep. This is a common pitfall for noobs, as no logic can
> explain to them why integer 0 should bool False, and integer
> 1 should bool True. But what's really going to cook your
> noodle is when you find out that any integer greater than 1
> bools True. Go figure! They'll say it's for consistency
> sake. But i say it's just a foolish consistency.
> 
> You need to learn the subtle difference between `==` and
> `is`.
> 
>     ## PYTHON 2.x
>     >>> 1 == True
>     True
>     >>> 1 is True
>     False
>     >>> 0 == False
>     True
>     >>> 0 is False
>     False

Is there an "is not" method that's not != so I can check is not false.

def move_zeros(array):
    l1 = [v for v in array if v is False or v != 0]
    l2 = [v for v in array if v is not False or v == 0]
    return l1 + l2

Cheers

Sayth