GeoStoneMarten
GeoStoneMarten

Reputation: 583

Test if tuple contains only None values with Python

I need to find if my tuple contains only None value.

I use this code but i not sure it's the good practice:

# coding=utf8

def isOnlyNoneValuesTuple(t):
    """
    test if tuple contains only None values
    """
    if not len(tuple(itertools.ifilter(None, t))):
        return True
    else:
        return False

print isOnlyNoneValuesTuple((None,None,None,None,None,None,None,None,None,None,None,None,))
print isOnlyNoneValuesTuple((None,None,None,"val",None,None,None,None,))

Do you know other good practice to test it?

Thank you for your opinions

Upvotes: 4

Views: 8710

Answers (4)

ndpu
ndpu

Reputation: 22571

return t.count(None) == len(t)

and it is faster than using all:

>>> setup = 't = [None, None]*100; t[1] = 1'
>>> timeit.timeit('all(item is None for item in t)', setup=setup)
0.8577961921691895
>>> timeit.timeit('t.count(None) == len(t)', setup=setup)
0.6855478286743164

and speed of all decreases according to index of not None element:

>>> setup = 't = [None, None]*100; t[100] = 1'
>>> timeit.timeit('all(item is None for item in t)', setup=setup)
8.18800687789917
>>> timeit.timeit('t.count(None) == len(t)', setup=setup)
0.698199987411499

BUT with big lists all is faster:

>>> setup = 't = [None, None]*10000; t[100] = 1'
>>> timeit.timeit('t.count(None) == len(t)', setup=setup)
47.24849891662598
>>> timeit.timeit('all(item is None for item in t)', setup=setup)
8.114514112472534

BUT not always though:

>>> setup = 't = [None, None]*10000; t[1000]=1'
>>> timeit.timeit('t.count(None) == len(t)', setup=setup)
47.475088119506836
>>> timeit.timeit('all(item is None for item in t)', setup=setup)
72.77452898025513

Conclusion that i make for myself about speed of all or count - very depends of data. If probability that you have all None in very big list - dont use all, it is very slow in that case.

Upvotes: 4

itsjeyd
itsjeyd

Reputation: 5280

I second BrenBarn's answer, it's very Pythonic. But since you also asked about testing the code, I'll add my two cents.

You can create appropriate data structures by making use of the fact that Python allows you to multiply a list containing a single element by a factor n to get a list that contains the same element n times:

print(isOnlyNoneValuesTuple(tuple(10 * [None])))
print(isOnlyNoneValuesTuple(tuple(3 * [None] + ["val"] + 4 * [None])))

Upvotes: 2

BrenBarn
BrenBarn

Reputation: 251438

return all(item is None for item in t)

Upvotes: 17

RemcoGerlich
RemcoGerlich

Reputation: 31270

return set(t) == {None}

Although I guess I'd use all() in practice.

Upvotes: 4

Related Questions