用Python对列表进行分段
我正在寻找一个python内置函数(或机制),将列表分段为所需的段长度(而不改变输入列表)。以下是我已有的代码:用Python对列表进行分段,python,list,segments,Python,List,Segments,我正在寻找一个python内置函数(或机制),将列表分段为所需的段长度(而不改变输入列表)。以下是我已有的代码: >>> def split_list(list, seg_length): ... inlist = list[:] ... outlist = [] ... ... while inlist: ... outlist.append(inlist[0:seg_length]) ... inlist[0
>>> def split_list(list, seg_length):
... inlist = list[:]
... outlist = []
...
... while inlist:
... outlist.append(inlist[0:seg_length])
... inlist[0:seg_length] = []
...
... return outlist
...
>>> alist = range(10)
>>> split_list(alist, 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
您可以使用列表理解:
>>> seg_length = 3
>>> a = range(10)
>>> [a[x:x+seg_length] for x in range(0,len(a),seg_length)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
虽然输出不一样,但我仍然认为:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
对于没有izip_最长的Python 2.4和2.5:
from itertools import izip, chain, repeat
def grouper(iterable, n, padvalue=None):
return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
一些演示代码和输出:
alist = range(10)
print list(grouper(alist, 3))
输出:
[(0,1,2),(3,4,5),(6,7,8),(9,无,无)]您需要如何使用输出?如果您只需要对其进行迭代,最好创建一个iterable,它可以生成您的组:
def split_by(sequence, length):
iterable = iter(sequence)
def yield_length():
for i in xrange(length):
yield iterable.next()
while True:
res = list(yield_length())
if not res:
return
yield res
用法示例:
>>> alist = range(10)
>>> list(split_by(alist, 3))
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
如果您只是在结果上循环,那么这比一次在内存中构建整个列表所用的内存要少得多,因为它一次只构建一个子集:
>>> for subset in split_by(alist, 3):
... print subset
...
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
+1.非常明智的做法。如果我的输入数据越来越大,我会记住这一点。您也可以将其作为生成器,即(范围(0,len(a),seg_length)中x的[x:x+seg_length]),这对于大序列来说更有效。相关