2014-11-08 3 views

ответ

3
import itertools 

In [69]: L = [1, 2, 0, 5, 2, 3, 0, 3, 4, 2, 3, 5, 6, 0, 4] 

In [70]: [list(i[1]) for i in itertools.groupby(L, bool) if i[0]] 
Out[70]: [[1, 2], [5, 2, 3], [3, 4, 2, 3, 5, 6], [4]] 
+1

Эй, вы и Я уже ответил на это. :-) – DSM

+0

@ DSM: действительно?/me запускает и проверяет историю – inspectorG4dget

+0

Не могли бы вы просто использовать 'bool' вместо' lambda x: x! = 0'? – khelwood

0

Если там нет повторения 0's:

listx = [1, 2, 0, 5, 2, 3, 0, 3, 4, 2, 3, 5, 6, 0, 4] 

final = [[]] 
for ele in listx: 
    final[-1].append(ele) if ele else final.append([]) 

print(final) 
[[1, 2], [5, 2, 3], [3, 4, 2, 3, 5, 6], [4]] 

Если повторять 0's:

def split_l(l): 
    final = [[]] 
    for ele in l: 
     final[-1].append(ele) if ele else final.append([]) 
    return filter(None, final) 

In [146]: timeit split_l(L) 
100 loops, best of 3: 19.6 ms per loop 

In [147]: timeit [list(i[1]) for i in itertools.groupby(L, bool) if i[0]] 
10 loops, best of 3: 33.8 ms per loop 
+0

Ваша версия и другие не делают то же самое в случае повторяющихся нулей (вы создаете пустые списки). Поскольку ОП не указывал, что любой подход имеет смысл, хотя я думаю, что вывод без списка выглядит более чистым. – DSM

+0

@DSM, обработал случай, когда 0 повторяются, еще эффективнее –

+0

Да, нули должны быть довольно разреженными, прежде чем groupby начнет выигрывать по производительности. Это один из недостатков подходов, основанных на itertools, они не всегда бывают такими быстрыми, как хотелось бы. С яркой стороны они красивы. – DSM