2013-05-01 6 views
11

リストに数字のシーケンスがあり、個々のシーケンス(単一の値を含む)を得るために、エレガントなソリューション、好ましくはリストの理解が必要です。私はこの小さな問題を解決しましたが、それはあまりpythonicではありません。Python - リストの理解度が高いインクリメンタルなシーケンスを見つけよう

以下のリストは、入力シーケンスを定義:

input = [1, 2, 3, 4, 8, 10, 11, 12, 17] 

所望の出力は次のようになります

output = [ 
    [1, 2, 3, 4], 
    [8], 
    [10, 11, 12], 
    [17], 
] 
+0

「[1,2,2,3,5]」のように2つの同一の数字が連続して表示されますか? – TerryA

+0

いいえ、すべての数字は一意であり、n + 1は常にnより大きくなります。 – skovsgaard

答えて

12
>>> from itertools import groupby, count 
>>> nums = [1, 2, 3, 4, 8, 10, 11, 12, 17] 
>>> [list(g) for k, g in groupby(nums, key=lambda n, c=count(): n - next(c))] 
[[1, 2, 3, 4], [8], [10, 11, 12], [17]] 
+1

あなたは将来を見ることができますか?それはただ...素晴らしいことです。 – TerryA

+0

@Haidroそれは私のものではありません:P – jamylak

+1

それは動作しますが、それは実際に自己説明的なコードではありません。 – Howard

8

Python的にはワンライナーを単純明快なコードを意味しません。

def runs(seq): 
    result = [] 
    for s in seq: 
     if not result or s != result[-1][-1] + 1: 
      # Start a new run if we can't continue the previous one. 
      result.append([]) 
     result[-1].append(s) 
    return result 

print runs([1, 2, 3, 4, 8, 10, 11, 12, 17]) 
関連する問題