测试元组是否仅包含Python的None值

时间:2014-01-22 21:30:43

标签: python python-2.7 tuples nonetype

我需要查找我的元组是否只包含None值。

我使用此代码,但我不确定这是不错的做法:

# 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,))

你知道其他好的做法来测试吗?

感谢您的意见

4 个答案:

答案 0 :(得分:15)

return all(item is None for item in t)

答案 1 :(得分:4)

return set(t) == {None}

虽然我猜我在实践中会使用all()。

答案 2 :(得分:3)

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

,它比使用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

all的速度根据非None元素的索引减少:

>>> 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
所有大型列表的

更快:

>>> 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

并非总是如此:

>>> 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

结论我为自己做了所有或计数的速度 - 非常依赖于数据。如果你在非常大的列表中拥有所有None的概率 - 不要使用all,那么在这种情况下它非常慢。

答案 3 :(得分:2)

我是第二个BrenBarn的回答,它非常Pythonic。但既然你也问过测试代码,我会加两分钱。

您可以利用以下事实创建适当的数据结构:Python允许您将包含单个元素的列表乘以因子n,以获得包含相同元素n次的列表:

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