2013-05-01 14 views
11

Listede bir dizi sıra var ve bireysel dizileri (tek değerler dahil) almak için zarif bir çözüm, tercihen liste anlama arıyorum. Bu küçük sorunu çözdüm ama çok pythonic değil.Python - liste kavraması ile artan sıralı dizileri bulmak

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

istenen çıkış olmalıdır:

Aşağıdaki liste, bir giriş dizisini tanımlar

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

Bir satırda iki aynı sayı olabilir, yani, [1,2,2,3,5] '? – TerryA

+0

Hayır, tüm sayılar benzersizdir ve n + 1 her zaman n'den büyük olacaktır. – skovsgaard

cevap

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

Gelecekte görebiliyor musunuz? Bu sadece ... inanılmaz. – TerryA

+0

@Haidro benimki değil: P – jamylak

+1

Çalışıyor - ama aslında kendini açıklayan kod değil. – Howard

8

Pythonic kolay ve basit bir kodu anlamına gelir, ve bir astarları.

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])