2017-08-07 69 views
-6

我該如何去分割兩個列表,還會留下一個餘數作爲自己的「列表」?例如:如何不斷拆分列表並分離餘數?

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15] 

不僅如此,但繼續減半每個子表得到這個期望的結果:

[1, 2, 3], [4, 5, 6], [7], [8, 9, 10], [11, 12, 13], [14], [15] 
+5

您是否嘗試過什麼自己了嗎?什麼時候分裂停止? –

+0

我試過將它分裂一次,但不知道從那裏去哪裏,只能設法分成相等的部分。當模式匹配底部列表時,分割應該停止,其中2個列表3後跟1個1的「列表」(因爲我使用的所有列表都將有一個餘數)。 –

+0

你可以[編輯]到你的問題。 –

回答

0

你可以使用遞歸發生器:

def split_gen(lst, start=0, stop=None): 
    if stop is None: 
     stop = len(lst) 
    size = (stop - start) 
    if size < 4: 
     yield lst[start:stop] 
     return 
    half = size // 2 
    # two chunks of length half, plus an optional remainder 
    yield from split_gen(lst, start, start + half) 
    yield from split_gen(lst, start + half, start + (half * 2)) 
    if size % 2 == 1: 
     yield lst[stop - 1:stop] 

演示:

>>> list(split_gen([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])) 
[[1, 2, 3], [4, 5, 6], [7], [8, 9, 10], [11, 12, 13], [14], [15]] 

注意它沒有'不會產生中介名單;它只是計算分割的索引,並只創建最終的子列表。

0

可以使用兩個函數,一個分裂初始列表部分列表,而另一個做所生成的列表上的遞歸調用,直到它不能例如被分割的任何進一步(len(sub-list) <= 3):

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

def split_list(lst): 
    if len(lst) > 3: 
     n = len(lst) // 2 # integer division to get the size of the new sublists 
     new_list = list([lst[0:n]]) # append sublist 1 
     new_list.append(lst[n:n+n]) # append sublist 2 
     new_list.append(lst[len(lst)-len(lst) % 2:]) # get remainder and append to list 
    return split_sub(new_list) 

def split_sub(lst): 
    chk = 0 
    new_list = [] 
    for item in lst: 
     if len(item) > 3: 
      n = len(item) // 2 
      new_list.append(list(item[0:n])) 
      new_list.append(item[n:n + n]) 
      new_list.append(item[len(item) - len(item) % 2:]) 
     else: 
      new_list.append(item) 
      chk += 1 
    if len(new_list) == chk: # if this condition is met then all sub lists are of the size <= 3 
     return new_list 
    return split_sub(new_list) 

print split_list(l) 

第二個函數將繼續運行,直到所有len(sub-list) <= 3這意味着它已完成拆分並將返回最終列表。

輸出:

[[1, 2, 3], [4, 5, 6], [7], [8, 9, 10], [11, 12, 13], [14], [15]]