Как хранить в разных списках? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть два списка следующим образом

 l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]

Я хочу создать три списка, таких как [4,5], [6,7,8,9] и [10,11,12] из l2. Я могу сделать это по-другому, но мне нужно сделать с помощью цикла.

Я уже пробовал что-то следующим образом:

a = []
b = []
c = []
a.append(l2[0:2])
b.append(l2[2:4+2])
c.append(l2[4+2:])

Я хочу это с помощью цикла, где будет элемент l1размер каждого нового списка.

Ответы [ 5 ]

1 голос
/ 28 октября 2019

Понимание списка с помощью islice

from itertools import islice
l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]
il2 = iter(l2)
l = [list(islice(il2, x)) for x in l1]
print(l)
# [[4, 5], [6, 7, 8, 9], [10, 11, 12]]

Производительность

Тестирование пяти методов, опубликованных здесь, с использованием timeit в наборе данных l1, l2 в блокноте Jupyter, с предварительно загруженными библиотеками. Pok Fung Chan пост был самым быстрым методом.

Method 1. pok fung chan -- 100000 loops, best of 3: 2.17 µs per loop
Method 2: ncica         -- 100000 loops, best of 3: 2.93 µs per loop
Method 3: darrylg       -- 100000 loops, best of 3: 4.02 µs per loop
Method 4: RoadRunner    -- 100000 loops, best of 3: 6.38 µs per loop
Method 5: Rakeesh       -- 100000 loops, best of 3: 8.76 µs per loop
1 голос
/ 28 октября 2019

Для следующего кода результирующие списки сохраняются в списке «результатов».

Переменная «counter» используется для указания начального индекса, а «x» - это каждый элемент в l1, поэтому l2[counter: counter + x] может получить список, который вы хотите. Это может быть не самый короткий код, но я думаю, что это ясно и кратко. Надеюсь, это поможет!

l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]

result = []
counter = 0
for x in l1:
   result += [l2[counter:counter+x]]
   counter += x

print(result)
[[4, 5], [6, 7, 8, 9], [10, 11, 12]]
0 голосов
/ 28 октября 2019

Вы можете преобразовать l2 в collections.deque, чтобы позволить O (1) всплывать слева, используя popleft().

from collections import deque

l1 = [2,4,3]
l2 = deque([4,5,6,7,8,9,10,11,12])

result = [[l2.popleft() for _ in range(x)] for x in l1]

print(result)
# [[4, 5], [6, 7, 8, 9], [10, 11, 12]]
0 голосов
/ 28 октября 2019

Использование списка и list.pop

Пример:

l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]
print([[l2.pop(0) for _ in range(i)] for i in l1])

Вывод:

[[4, 5], [6, 7, 8, 9], [10, 11, 12]]
0 голосов
/ 28 октября 2019

вы можете сделать это следующим образом:

l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]
l2_ = l2.copy()
result = []

for item in l1:
    result.append(l2_[:item])
    del l2_[:item]

a,b,c = result
print (a)
print (b)
print (c)

вывод:

[4, 5]
[6, 7, 8, 9]
[10, 11, 12]
...