преобразовать список в список и взять длину вложенного списка из другого списка в Python - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть такой список:

l1=[1,2,3,4,5,7,8,9,23,32,33] 
l2=[5,3,1,2]

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

l3=[[1,2,3,4,5],[7,8,9],[23],[32,33]]

Длина каждого вложенного списка будет составлять l2,

Как сделать это эффективно, используя python.

Ответы [ 4 ]

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

Вы можете использовать itertools:

from itertools import repeat, islice
# itertools works with iterators, so we'll make one
itl1 = iter(l1)

А теперь, если вам нужен ленивый результат:

lazy = map(islice, repeat(itl1), l2)

Если вы хотите получить результат:

realized = list(map(list, lazy))

Дело в том, что islice истощает итератор itl1 на суммы, указанные в l2 на каждом шаге map.

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

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

>>> from itertools import islice
>>> l1=[1,2,3,4,5,7,8,9,23,32,33] 
>>> l2=[5,3,1,2]
>>> it = iter(l1)
>>> [list(islice(it, n)) for n in l2]
[[1, 2, 3, 4, 5], [7, 8, 9], [23], [32, 33]]
0 голосов
/ 27 ноября 2018

Вот решение с использованием itertools.accumulate и pairwise, последний - рецепт , доступный в itertools документах или доступный в третьей стороне more_itertools.pairwise:

from itertools import accumulate
from more_itertools import pairwise

L1 = [1,2,3,4,5,7,8,9,23,32,33] 
L2 = [5,3,1,2]

L3 = [L1[i: j] for i, j in pairwise(accumulate([0] + L2))]

[[1, 2, 3, 4, 5], [7, 8, 9], [23], [32, 33]]
0 голосов
/ 27 ноября 2018

Используйте понимание:

>>> l3 = [[l1.pop(0) for _ in range(x)] for x in l2]
>>> l3
[[1, 2, 3, 4, 5], [7, 8, 9], [23], [32, 33]]

Если вы не хотите изменять l1, используйте итератор:

>>> l1=[1,2,3,4,5,7,8,9,23,32,33] 
>>> it = iter(l1)
>>> l3 = [[next(it) for _ in range(x)] for x in l2]
>>> l3
[[1, 2, 3, 4, 5], [7, 8, 9], [23], [32, 33]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...