Bon 'ol itertools.groupby
à la rescousse:
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
donne
>>> 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
[modifier]
Depuis il semble y avoir une discussion dans les commentaires, je vais vous expliquer pourquoi j'aime cette approche mieux que d'autres.
Nous essayons de savoir si il y a un groupe contigu de non-Aucun des objets, et
sum(1 for k,g in groupby(seq, lambda x: x is not None) if k)
compte le nombre de contiguë non Aucun des objets, à l'aide de la fonction dans la stdlib, qui est conçu pour effectuer la collecte de groupes contigus. Dès que nous voyons groupby
, nous pensons que "les groupes contigus", et vice-versa. Dans ce sens, c'est l'auto-documentation. C'est la définition de mon objectif.
À mon humble avis la seule faiblesse est qu'il n'a pas de court-circuit, et qui pourrait être fixe, mais après y avoir réfléchi quelques je préfère encore ce qu'il utilise une primitive j'aime -- "compter le nombre de contiguë non Aucun des groupes", ce que je préfère tout simplement "dites-moi si oui ou non il y a plus d'un contigus non Aucun groupe dès que vous le pouvez".
De nombreuses approches pour mettre en œuvre la dernière compter sur intelligent observations sur le problème, comme "s'il n'y a qu'un groupe contigu de pas-Aucun des objets, alors, si nous balayage jusqu'à ce que nous trouvons le premier pas-Aucun objet, et ensuite analyser les objets jusqu'à ce que nous trouvons le premier non-Aucun groupe si l'un existe, alors si quelque chose ne vous reste Aucun nous donne notre réponse." (Ou quelque chose comme ça, qui est une partie de mon problème: je dois penser à elle.) Pour moi qui se sent comme l'utilisation de "détails de mise en œuvre" sur le problème à résoudre, et se concentre sur les propriétés du problème que nous pouvons utiliser pour le résoudre, plutôt que de simplement en spécifiant le problème de Python et de laisser Python faire le travail.
Je suis un supporter de très peu de cerveau, comme la dit-il, et je voudrais éviter d'avoir à faire le malin, comme dans mon expérience, c'est un parcours jonché d'ÉCHOUER.
Comme toujours, tout le monde est le kilométrage peut varier, bien sûr, et probablement en proportion de leur intelligence.