4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

リストの連続する値をまとめる

Posted at

単調増加の数列を、連続する値毎にまとめる簡潔な記述方法があったのでメモしておきます。

import itertools

sample = [1,2,3,5,6,7,9,10]

[list(g) for _, g in itertools.groupby(
    sample, key=lambda n, c=itertools.count(): n - next(c))]

# => [[1, 2, 3], [5, 6, 7], [9, 10]]

itertools.groupby は、第一引数のイテラブルの各要素を第二引数に渡して、その戻り値が同一の連続する要素を返すイテレータを、第二引数の関数に渡した要素とともに返します。
上の例では、第一引数にsample、第二引数keyにラムダ式をとっています。
ラムダ式には、nと、省略可能なcの二つの引数がありますが、cにはitertools.count()のデフォルト値が指定されており、groupbyにおける連続する要素の同一性の判定の際に呼ばれる時は、nsampleの各要素が渡されます。itertools.count()は、0から1ずつ増加する数を返すイテレータを生成します。cのデフォルト値はラムダ式が定義されたときに一回だけ実行され、0から順に+1された数を返すイテレータが代入されます。ですので、n - next(c)は、next(c)は毎回の呼び出しで1ずつ増加するので、n1づつ増加すれこのラムダ式からは同じ値が返されますが、n1より大きく増加すれば違う値が返されます。このラムダ式の戻り値が同一の連続する要素を返すイテレータがgで、list(g)により、連続した要素をネストしたリストにまとめたリストがリスト内包表記により生成されます。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?