1. ホーム
  2. python

[解決済み] リスト内の連続した数のグループを識別する

2022-08-18 23:54:48

質問

連続した数値のグループをリストで識別したいのですが、どうすればよいでしょうか。

myfunc([2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20])

を返します。

[(2,5), (12,17), 20]

そして、これを行うための最良の方法は何か(特にPythonに組み込まれたものがある場合)疑問に思っていました。

編集:もともと、個々の数値は範囲ではなく、個々の数値として返されるべきであると言及するのを忘れていたことに注意してください。

どのように解決するのですか?

more_itertools.consecutive_groups はバージョン 4.0 で追加されました。

デモ

import more_itertools as mit


iterable = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20]
[list(group) for group in mit.consecutive_groups(iterable)]
# [[2, 3, 4, 5], [12, 13, 14, 15, 16, 17], [20]]

コード

このツールを応用して、連続した数の範囲を求めるジェネレータ関数を作成します。

def find_ranges(iterable):
    """Yield range of consecutive numbers."""
    for group in mit.consecutive_groups(iterable):
        group = list(group)
        if len(group) == 1:
            yield group[0]
        else:
            yield group[0], group[-1]


iterable = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 20]
list(find_ranges(iterable))
# [(2, 5), (12, 17), 20]

この ソース をエミュレートする実装です。 クラシックレシピ をエミュレートします (@Nadia Alramli によるデモ)。

注意してください。 more_itertools はサードパーティ製のパッケージで pip install more_itertools .