2024-09-28 01:28:46 发布
网友
基于任意数量的索引将列表拆分为多个部分的最佳方法是什么?E、 g.给出以下代码
indexes = [5, 12, 17] list = range(20)
还这样的东西
part1 = list[:5] part2 = list[5:12] part3 = list[12:17] part4 = list[17:]
如果没有索引,它应该返回整个列表。
我也有兴趣看到一种更像Python的方式来做这件事。但这是个糟糕的解决方案。您需要添加对空索引列表的检查。
大致如下:
indexes = [5, 12, 17] list = range(20) output = [] prev = 0 for index in indexes: output.append(list[prev:index]) prev = index output.append(list[indexes[-1]:]) print output
产生
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16], [17, 18, 19]]
这是我能想到的最简单、最具Python性的解决方案:
def partition(alist, indices): return [alist[i:j] for i, j in zip([0]+indices, indices+[None])]
如果输入非常大,那么迭代器解决方案应该更方便:
from itertools import izip, chain def partition(alist, indices): pairs = izip(chain([0], indices), chain(indices, [None])) return (alist[i:j] for i, j in pairs)
当然,还有非常非常懒的解决方案(如果您不介意获取数组而不是列表,但无论如何您可以将它们还原为列表):
import numpy partition = numpy.split
我的解决方案和伊尔·比马的类似
>>> def parts(list_, indices): ... indices = [0]+indices+[len(list_)] ... return [list_[v:indices[k+1]] for k, v in enumerate(indices[:-1])]
如果您愿意稍微改变输入索引的方式,从绝对索引改为相对索引(即从[5, 12, 17]改为[5, 7, 5]),则下面的内容也将为您提供所需的输出,而不会创建中间列表。
[5, 12, 17]
[5, 7, 5]
>>> from itertools import islice >>> def parts(list_, indices): ... i = iter(list_) ... return [list(islice(i, n)) for n in chain(indices, [None])]
我也有兴趣看到一种更像Python的方式来做这件事。但这是个糟糕的解决方案。您需要添加对空索引列表的检查。
大致如下:
产生
这是我能想到的最简单、最具Python性的解决方案:
如果输入非常大,那么迭代器解决方案应该更方便:
当然,还有非常非常懒的解决方案(如果您不介意获取数组而不是列表,但无论如何您可以将它们还原为列表):
我的解决方案和伊尔·比马的类似
替代方法
如果您愿意稍微改变输入索引的方式,从绝对索引改为相对索引(即从
[5, 12, 17]
改为[5, 7, 5]
),则下面的内容也将为您提供所需的输出,而不会创建中间列表。相关问题 更多 >
编程相关推荐