itertools.groupby
救助に良い'ol :
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オブジェクトの連続したグループが1つあるかどうかを調べようとしていますが、
sum(1 for k,g in groupby(seq, lambda x: x is not None) if k)
連続するグループの収集を行うように設計されたstdlibの関数を使用して、連続する非Noneオブジェクトの数をカウントします。私たちが見るとすぐにgroupby
、私たちは「隣接するグループ」と思います。逆もまた同様です。その意味で、それは自己文書化です。これが基本的に私の目標の定義です。
IMHOの唯一の弱点は、短絡しないことです。これは修正できますが、考えてみると、好きなプリミティブを使用しているので、これを好む人もいます。「連続する非Noneグループの数を数える」 -これは、単に「できるだけ早く、隣接する非Noneグループが複数あるかどうかを教えてください」ということを好みます。
最後のアプローチを実装するためのアプローチの多くは、問題に関する巧妙な観察に依存しています。たとえば、「非なしオブジェクトの連続したグループが1つしかない場合、最初の非なしオブジェクトが見つかるまでスキャンしてから、オブジェクトをスキャンする場合」などです。最初の非Noneグループが存在する場合はそれが見つかるまで、残っているものがNoneであるかどうかが答えになります。」(または、私の問題の一部であるそのようなもの:私はそれについて考えなければなりません。)それを解決するために問題についての「実装の詳細」を使用するように感じ、解決するために使用できる問題のプロパティに焦点を当てます単に問題をPythonに指定して、Pythonに作業を任せるのではなく、
ことわざにあるように、私は頭脳が非常に少ないクマです。私の経験では、FAILが散らばっているルートなので、賢くする必要はありません。
いつものように、もちろん、そしておそらく彼らの賢さに比例して、すべての人のマイレージは変わるかもしれません。