【发布时间】:2017-05-09 11:31:27
【问题描述】:
我有一个列表[1,2,3,4,5,6,7,8,9]。我想根据它创建 2D 列表
长度。
假设我的长度为 3,2,4
所以结果列表必须像[[1,2,3],[4,5],[6,7,8,9]]。
任何人都可以提出一些方法来实现这一目标吗?
【问题讨论】:
标签: python python-2.7 list split
我有一个列表[1,2,3,4,5,6,7,8,9]。我想根据它创建 2D 列表
长度。
假设我的长度为 3,2,4
所以结果列表必须像[[1,2,3],[4,5],[6,7,8,9]]。
任何人都可以提出一些方法来实现这一目标吗?
【问题讨论】:
标签: python python-2.7 list split
你可以通过itertools.islice简单地做到这一点:
>>> from itertools import islice
>>> lst = [1,2,3,4,5,6,7,8,9]
>>> it = iter(lst)
>>> [list(islice(it,i)) for i in [3,2,4]]
[[1, 2, 3], [4, 5], [6, 7, 8, 9]]
【讨论】:
你可以这样做:
def subdiv(sliceable,lengths):
idx = 0
for length in lengths:
yield sliceable[idx:idx+length]
idx += length
那么你可以这样称呼它:
>>> list(subdiv([1,2,3,4,5,6,7,8,9],[3,2,4]))
[[1, 2, 3], [4, 5], [6, 7, 8, 9]]
此方法适用于所有支持切片的事物。例如元组:
>>> list(subdiv((1,2,3,4,5,6,7,8,9),[3,2,4]))
[(1, 2, 3), (4, 5), (6, 7, 8, 9)]
最后,lengths 可以源自任何类型的可迭代对象(列表、元组、生成器等)。
【讨论】:
itertools.islice 相比,我认为这样做没有任何优势?
islice 更有效,因为在这里您使用的是可迭代对象。因此,list(..) 构造函数现在不会提前调整大小,因此可能会“扩展”几次。但我同意没有太大的优势。