2015-12-22 83 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