Создайте подсписки, зная длины каждого списка - PullRequest
2 голосов
/ 18 октября 2019

У меня возникли некоторые проблемы при попытке создать это.

У меня есть следующие списки:

values = [(3, 50), (4, 20), (10, 30), (11, 60), (12, 70), (13, 20)]
lens = [2,4]

Что я хочу сделать, это создать еще один список подсписков, зная точноедлина каждого подсписка, поэтому вывод будет следующим:

result = [[(3, 50), (4, 20)], [(10, 30), (11, 60), (12, 70), (13, 20)]]

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы можете создать итератор из values и вызвать next для него в понимании списка:

iterator = iter(values)
result = [[next(iterator) for _ in range(length)] for length in lens]
1 голос
/ 18 октября 2019

Вот два возможных подхода.

Более «базовый», управление индексами «вручную»:

values = [(3, 50), (4, 20), (10, 30), (11, 60), (12, 70), (13, 20)]
lens = [2,4]

def slices1(values, lens):
    out = []
    index = 0
    for length in lens:
        out.append(values[index:index+length])
        index += length
    return out

print(slices1(values, lens))
# [[(3, 50), (4, 20)], [(10, 30), (11, 60), (12, 70), (13, 20)]]

Другой, с использованием итератора в списке и itertools.islice , чтобы получить из него последовательные кусочки:

from itertools import islice

def slices2(values, lens):
    it = iter(values)
    out = [list(islice(it,length)) for length in lens]
    return out

print(slices2(values, lens))
# [[(3, 50), (4, 20)], [(10, 30), (11, 60), (12, 70), (13, 20)]]
...