Вложенные списки чанков, начиная с самого глубокого уровня - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы иметь функцию, которая разбивает мой список на подсписки, а затем эти подсписки на дополнительные подсписки, согласно этой схеме. Количество вложений и размер_блока будут различаться. Пожалуйста, помните о [4] и [9] в lst2, это важно.

block_sizes = [5, 2, 1]
my_lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

# desired return
lst1 = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]] # chunked into sublists of size 5
lst2 = [[0, 1], [2, 3], [4], [5, 6], [7, 8], [9], [10, 11]] # chunked into sublists of size 2; be aware of [4] and [9]
lst3 = [[0], [1], [2], [3], [4], [5], ... [11]]

Я уже пробовал это, но блок не работает должным образом:

block_sizes = [5, 2, 1]

def chunk_into_list(lst, chunk_size):
    return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]

for i, block_size in enumerate(block_sizes):

    for step in range(len(block_sizes[:(i + 1)])):
        my_lst = chunk_in_sizes(my_lst, block_sizes[step])

    print(my_lst)

Но это приводит к:

[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]]
[[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]], [[10, 11]]]
[[[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]], [[[10, 11]]]]

Я буду использовать это для моделирования, поэтому эффективность будет важна, если это возможно.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

Я думаю, что это не самый оптимальный способ, но, насколько я понимаю, он будет делать то, что вы хотите.

block_sizes = [5, 2, 1]
my_lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

def chunk_into_list(lst, chunk_size):
    if lst and isinstance(lst[0], list):
        lst_new = []
        for nested_lst in lst:
            lst_new += (chunk_into_list(nested_lst, chunk_size))
        return lst_new
    else:
        return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]


for i, block_size in enumerate(block_sizes):
    for step in range(len(block_sizes[:(i + 1)])):
        my_lst = chunk_into_list(my_lst, block_sizes[step])

    print(my_lst)

#Output
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]]
[[0, 1], [2, 3], [4], [5, 6], [7, 8], [9], [10, 11]]
[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]]
0 голосов
/ 08 апреля 2020

Это то, что вы ищете?

my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

def divide_chunks(length_list, n):
    for i in range(0, len(length_list), n):
      yield length_list[i:i + n]


block_sizes = [5, 2, 1]

for block_length in block_sizes:
  results = list(divide_chunks(my_list, block_length))
  print(results)
  # output
  [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]]
  [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11]]
  [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]]
0 голосов
/ 08 апреля 2020

Вы имели в виду:

lst = [0,1,2,3,4,5,6,7,8,9,10,11]
for block_size in block_sizes:
    print(chunk_in_sizes(lst, block_size))
...