実際には非常に単純な変更です。
from itertools import groupby, count
from operator import itemgetter
a = [1,2,3,5,55,56]
def consc(b, step):
for k, g in groupby(zip(count(step=step), b), lambda (i, x): i-x):
print map(itemgetter(1), g)
consc(a, 2)
これにより、次のことが得られます。
[1]
[2]
[3, 5]
[55]
[56]
を使用する代わりに、目的の値のステップでandenumerate()
を使用すると、目的の結果が得られます。zip()
count()
少しクリーンアップ:
from itertools import groupby, count
from operator import itemgetter
def _sub(item):
a, b = item
return a - b
def consecutive(iterable, step):
for _, g in groupby(zip(count(step=step), iterable), _sub):
yield map(itemgetter(1), g)
a = [1, 2, 3, 5, 55, 56]
print(list(consecutive(a, 2)))
ここにジェネレーターを用意し、よりわかりやすい名前を使用することは理にかなっています。実際の関数を使用すると、関数を使用するたびに再宣言する必要がなくなりlambda
ます。これは、言語から削除された引数のアンパッキングを使用しないことで、Python 3.x でも機能します。