0

リスト内の連続した数字を見つけるためのこのコードがあります:

from itertools import groupby
from operator import itemgetter

a = [1,2,3,5,55,56]

def consc(b):
  for k, g in groupby(enumerate(b), lambda (i,x):i-x):
     print map(itemgetter(1), g)  

consc(a)

出力:

[1, 2, 3]
[5]
[55, 56]

ただし、他のデルタ (1 から 10) も検索できるようにしたいと考えています。たとえば、2 の差があると、同じリストから次の出力が得られます。

[1]
[2]
[3,5]
[55]
[56]

ありがとう!

4

1 に答える 1

2

実際には非常に単純な変更です。

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 でも機能します。

于 2013-04-21T16:20:18.213 に答える