2014-11-08 71 views
1

我有一个列表,说拆分列表为单独列出[Python的]

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

你如何分割成清单不包含0连续的部分?例如,该列表将被分成

separated = [[1, 2], [5, 2, 3], [3, 4, 2, 3, 5, 6], [4]] 

回答

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 2014-11-08 22:22:52

+0

@DSM:真的吗? /我运行并检查历史 – inspectorG4dget 2014-11-08 22:24:08

+0

难道你不能只使用'bool'而不是'lambda x:x!= 0'? – khelwood 2014-11-08 22:25:22

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

您的版本和另一个在重复零(您生成空列表)的情况下不会做同样的事情。由于OP没有具体说明任何一种方法是否合理,尽管我认为无列表输出看起来更清晰。 – DSM 2014-11-08 22:43:00

+0

@DSM处理了0重复的情况,效率更高 – 2014-11-08 22:56:57

+0

没错,在groupby开始赢得性能方面之前,零需要非常稀疏。这是基于itertools的方法的一个缺点,它们并不总是像人们想要的那样快。在光明的一面,他们很漂亮。 – DSM 2014-11-08 23:06:08