我有两个清单,如下
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
的元素将是每个新列表的大小。
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]]
您可以通过这种方式做到:
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]
使用列表推导和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]]
您可以将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]]
具有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