2013-05-01 20 views
11

Ho una sequenza di numeri in un elenco e sto cercando una soluzione elegante, di preferenza di lista, per ottenere le singole sequenze (compresi i valori singoli). Ho risolto questo piccolo problema ma non è molto pitonico.Python - sequenze trovare incrementale numerate con una lista di comprensione

Il seguente elenco definisce una sequenza di immissione:

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

L'output desiderato dovrebbe essere:

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

Potrebbe esserci due numeri identici in una riga, cioè "[1,2,2,3,5]'? – TerryA

+0

No, tutti i numeri sono univoci e n + 1 sarà sempre maggiore di n. – skovsgaard

risposta

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

Riesci a vedere nel futuro? È semplicemente ... fantastico. – TerryA

+0

@Haidro non è il mio però: P – jamylak

+1

Funziona - ma non è un codice che si spiega da sé. – Howard

8

Pythonic significa semplice, codice semplice, e non battute.

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