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

Python 如何存储在不同的列表中?,python,list,slice,Python,List,Slice,我有两个清单如下 l1 = [2,4,3] l2 = [4,5,6,7,8,9,10,11,12] 我想从l2中列出三个列表,如[4,5],[6,7,8,9]和[10,11,12]。我可以用不同的方法来做,但我需要使用循环 我已经尝试了以下方法: a = [] b = [] c = [] a.append(l2[0:2]) b.append(l2[2:4+2]) c.append(l2[4+2:]) 我希望使用循环,其中l1的元素将是每个新列表的大小。对于以下代码,结果列表存储在“resu

我有两个清单如下

 l1 = [2,4,3]
l2 = [4,5,6,7,8,9,10,11,12]
我想从
l2
中列出三个列表,如
[4,5]
[6,7,8,9]
[10,11,12]
。我可以用不同的方法来做,但我需要使用循环

我已经尝试了以下方法:

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

我希望使用循环,其中
l1
的元素将是每个新列表的大小。

对于以下代码,结果列表存储在“result”列表中

变量“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]]

对于以下代码,结果列表存储在“结果”列表中

变量“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]]

您可以这样做:

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]

您可以这样做:

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]]
输出:

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

使用列表压缩和
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]]
输出:

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)


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


带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]]
性能

在Jupyter笔记本的数据集l1、l2上使用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

带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]]
性能

在Jupyter笔记本的数据集l1、l2上使用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