如何存储在不同的列表中?

问题描述 投票:0回答:5

我有两个清单,如下

 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的元素将是每个新列表的大小。

python list slice
5个回答
0
投票
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
投票

您可以通过这种方式做到:

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]

0
投票

使用列表推导和list.pop

Ex:

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
投票

您可以将l2转换为collections.deque,以允许使用popleft()从左侧弹出O(1)。

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
投票

具有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]]

Performance

使用Jupyter笔记本中的timeit测试了这里发布的五种方法,并预加载了库。薄凤灿的帖子有最快的方法。

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
© www.soinside.com 2019 - 2024. All rights reserved.