Преобразовать список в куски увеличивающегося размера - PullRequest
0 голосов
/ 18 ноября 2018

Как я могу преобразовать список во вложенный список с увеличением размера подсписков?

Например, от

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

до

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

Ответы [ 4 ]

0 голосов
/ 18 ноября 2018

В качестве последующего решения Тимгеба , без itertools, вам необходимо отслеживать индекс:

l = [1, 2, 3, 4, 5, 6]

i, slice_length = 0, 1
result = []
while i < len(l):
    result.append(l[i:i + slice_length])
    i += slice_length
    slice_length += 1

print(result)
# [[1], [2, 3], [4, 5, 6]]
0 голосов
/ 18 ноября 2018

Несколько itertools и enumerate на помощь:

from itertools import count, accumulate as acc, takewhile as tw

lst = [1, 2, 3, 4, 5, 6]
[lst[c:c+i] for i, c in enumerate(tw(lambda x: x < len(lst), acc(count())), 1)]
# [[1], [2, 3], [4, 5, 6]]
0 голосов
/ 18 ноября 2018

Предполагая, что длина списка имеет правильную длину, чтобы последний кусок имел правильный размер, вы можете использовать списки sum, range и для понимания списка , чтобы решить вашу проблему в несколько строк:

l = [1, 2, 3, 4, 5, 6]
slices = range(1, (len(l) + 1)/2 + 1)
result = [l[sum(slices[:s-1]):sum(slices[:s-1])+s] for s in slices]
0 голосов
/ 18 ноября 2018

Я бы сделал это с islices поверх итератора исходного списка. Таким образом, я могу просто указать количество элементов, чтобы не беспокоиться о том, в какой позиции я сейчас нахожусь. (Кроме того, следующий код работает с любой итерацией.)

def increasing_chunks(iterable):
    it = iter(iterable)
    i = 1

    while True:
        chunk = list(islice(it, i))
        if not chunk:
            break
        yield chunk
        i += 1

Последний кусок может быть обрезан до любого количества элементов, оставленных итератором.

Демо-версия:

>>> list(increasing_chunks([1, 2, 3, 4, 5, 6]))
[[1], [2, 3], [4, 5, 6]]
>>> list(increasing_chunks([1, 2, 3, 4, 5, 6, 7, 8]))
[[1], [2, 3], [4, 5, 6], [7, 8]]

Если вы хотите удалить усеченные куски, измените код следующим образом:

def increasing_chunks_strict(iterable):
    it = iter(iterable)
    i = 1

    while True:
        chunk = list(islice(it, i))
        if len(chunk) < i:
            break
        yield chunk
        i += 1

Теперь усеченные куски не включаются в результат.

>>> list(increasing_chunks_strict([1, 2, 3, 4, 5, 6]))
[[1], [2, 3], [4, 5, 6]]
>>> list(increasing_chunks_strict([1, 2, 3, 4, 5, 6, 7, 8]))
[[1], [2, 3], [4, 5, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...