我需要查找我的元组是否只包含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,))
你知道其他好的做法来测试吗?
感谢您的意见
答案 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])))