2015-12-22 86 views
0

说我有一个列表:[1, 2, 3, 4, -1, 5, 6, 7, -1, 0, 0, 3, 2, 1]基于值将列表拆分成更小的列表?

我想这个名单拆分为使用值-10, 0作为分隔符:

[[1, 2, 3, 4], [5, 6, 7], [], [3, 2, 1]]

(注意空第三列表)

如何我会达到这个目标吗?我目前的解决方案只是一个微不足道的循环,但我想知道是否为任何长度的分隔符提供了更为pythonic的解决方案(使用列表解析)?

当前解决方案的要求(混乱和哈克:P)

string = '|'.join([str(x) for x in data]).replace('-1', ',').replace('0|0', ',') 
buckets = [x.split('|') if y for x in string.split(',')] 
+1

如何发布您的解决方案? – mhawke

+0

如果创建一个字符串是可以接受的(这是特定用例),你可以使用它... –

+0

@mhawke肯定......虽然这很微不足道,但我不认为它会为问题增加很多价值。 –

回答

1

这不是小事,但你可以做这样的:

my_list = [1, 2, 3, 4, -1, 5, 6, 7, -1, 0, 0, 3, 2, 1] 

my_list = ','.join(map(str, my_list)) 
my_list = [x.split(',') for y in my_list.split('0,0,') for x in y.split(',-1,')] 
my_list = [map(int, x) if x != [''] else [] for x in my_list] 
+0

'map(str,l)'中的'l'从哪里来?它应该是'my_list'而不是? –

+0

另外我觉得可能会有边缘情况,其中值是''''。 –

+0

是的,它应该是'my_list'。 –

0

使用简单的for loop and check conditions

代码:

lst = [1, 2, 3, 4, -1, 5, 6, 7, -1, 0, 0, 3, 2, 1,-1,0] 
output_lst = [] 
check = 0 
sample=[] 
for val in lst: 
    if val == -1 : 
     output_lst.append(sample) 
     check = 0 
     sample = [] 
     continue 
    if val == 0 :  

     if check ==1 : 
      output_lst.append(sample[:-1]) 
      check = 0 
      sample = [] 
      continue 
     check = 1 
    sample.append(val) 
if check ==1: 
    output_lst.append(sample) 
print output_lst 

输出:

[[1, 2, 3, 4], [5, 6, 7], [], [3, 2, 1], [0]] 
0

试试这个

使用一个迭代做到这一点。

ar = [1, 2, 3, 4, -1, 5, 6, 7, -1, 0, 0, 3, 2, 1] 
data = ', '.join(map(str, ar)) 
import re 
data = re.split(", -1,| 0, 0,",data) 
bucket = [] 
import ast 
for y in data: 
    hac = ast.literal_eval("["+y+"]") 
    bucket.append(hac) 
print bucket