2016-01-14 2 views
6

Я знаю, что я могу разделить список на подсписки одинакового размера с помощью:Как разбить суб-списки на под-списки k раз? (Python)

segment = len(list)//k 
sub_lists = [list[i:i+segment] for i in range(0, len(list), segment)] 

Однако я не уверен, как разбить список длиной к^т в подсписки, то дальнейший суб-листы, пока каждый вложенный список не имеет длину 1.

Например:

k = 2 
list = [1, 2, 3, 4, 5, 6, 7, 8] 
list = [[1, 2, 3, 4], [5, 6, 7, 8]] 
list = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 
list = [[[[1], [2]], [[3], [4]]], [[[5], [6]], [[7], [8]]]] 

Всякий раз, когда я пытался цикл это я получаю привязанный в узлах, есть сокращенное?

+0

Вы хотите разделить каждый список в 'k' подсписок, не так ли? – Finwood

+0

Да, в сущности. Простите, если это было не так ясно. – Anna

+2

Просто из любопытства, это академическое упражнение, или есть какая-то цель, которую вы имеете в виду? –

ответ

4

Это, по существу код:

def split_list(input_list, segments): 
    if len(input_list) == 1: 
     return input_list 
    segment_length = len(input_list) // segments 
    return [split_list(input_list[i:i+segment_length], segments) 
      for i in range(0, len(input_list), segment_length)] 

>>> split_list([1, 2, 3, 4, 5, 6, 7, 8], 2) 
[[[[1], [2]], [[3], [4]]], [[[5], [6]], [[7], [8]]]] 
+0

Это отвечает на мой вопрос отлично, спасибо! – Anna

3
def sub_k_list(a, k): 
    p = len(a) // k 
    return a if not p else [sub_k_list(a[:p], k), sub_k_list(a[p:], k)] 

k = 2 
a = [1, 2, 3, 4, 5, 6, 7, 8] 

print(sub_k_list(a, k)) 

Результат:

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

Edit: удалить, если ...

def sub_k_list(a, k): 
    p = len(a) // k 
    return a * (not p) or [sub_k_list(a[:p], k), sub_k_list(a[p:], k)] 

 Смежные вопросы

  • Нет связанных вопросов^_^