很好itertools.groupby
的救援:
from itertools import groupby
def contiguous(seq):
return sum(1 for k,g in groupby(seq, lambda x: x is not None) if k) == 1
给
>>> contiguous([1,2,3,None,None])
True
>>> contiguous([None, 1,2,3,None])
True
>>> contiguous([None, None, 1,2,3])
True
>>> contiguous([None, 1, None, 2,3])
False
>>> contiguous([None, None, 1, None, 2,3])
False
>>> contiguous([None, 1, None, 2, None, 3])
False
>>> contiguous([1, 2, None, 3, None, None])
False
[编辑]
由于评论中似乎有一些讨论,我将解释为什么我比其他一些方法更喜欢这种方法。
我们试图找出是否存在一组连续的非 None 对象,并且
sum(1 for k,g in groupby(seq, lambda x: x is not None) if k)
使用stdlib中的函数计算连续的非None对象的数量,该函数旨在收集连续的组。一看到groupby
,我们就认为是“连续组”,反之亦然。从这个意义上说,它是自我记录的。这基本上是我的目标的定义。
恕我直言,唯一的弱点是它不会短路,这可以修复,但经过思考后,我仍然更喜欢它,因为它使用了我喜欢的原语——“计算连续非无组的数量” - 我更喜欢简单地“尽快告诉我是否有多个连续的非无组”。
实现最后一个的许多方法都依赖于对问题的巧妙观察,例如“如果只有一组连续的非无对象,那么如果我们扫描直到找到第一个非无对象,然后扫描对象直到我们找到第一个非 None 组(如果存在),那么剩下的是否为 None 给了我们答案。” (或者类似的东西,这是我的问题的一部分:我必须考虑一下。)对我来说,这感觉就像使用有关问题的“实施细节”来解决它,并专注于我们可以用来解决的问题的属性它,而不是简单地将问题指定给 Python 并让 Python 完成工作。
正如俗话说的那样,我是一只大脑很少的熊,我喜欢避免变得聪明,因为根据我的经验,这是一条充满失败的路线。
与往常一样,当然,每个人的里程可能会有所不同,而且可能与他们的聪明程度成正比。