oro*_*aki 11 python paging pagination data-paging
我希望能够采取如下序列:
my_sequence = ['foo', 'bar', 'baz', 'spam', 'eggs', 'cheese', 'yogurt']
Run Code Online (Sandbox Code Playgroud)
使用如下功能:
my_paginated_sequence = get_rows(my_sequence, 3)
Run Code Online (Sandbox Code Playgroud)
要得到:
[['foo', 'bar', 'baz'], ['spam', 'eggs', 'cheese'], ['yogurt']]
Run Code Online (Sandbox Code Playgroud)
这就是我想到的想法:
def get_rows(sequence, num):
count = 1
rows = list()
cols = list()
for item in sequence:
if count == num:
cols.append(item)
rows.append(cols)
cols = list()
count = 1
else:
cols.append(item)
count += 1
if count > 0:
rows.append(cols)
return rows
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 17
如果你知道你有一个可切片的序列(列表或元组),
def getrows_byslice(seq, rowlen):
for start in xrange(0, len(seq), rowlen):
yield seq[start:start+rowlen]
Run Code Online (Sandbox Code Playgroud)
这当然是一个生成器,所以如果你绝对需要一个列表作为结果,你list(getrows_byslice(seq, 3))
当然会使用等等.
如果您开始使用的是通用迭代,则itertools配方提供有关grouper
配方的帮助......:
import itertools
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
Run Code Online (Sandbox Code Playgroud)
(再次,list
如果列表是你想要的,你需要调用它),当然).
由于您实际上希望截断最后一个元组而不是填充,因此您需要"修剪"最后一个元组的尾随填充值.
此版本适用于任何(可能是惰性和非可切片)迭代,并生成一个惰性可迭代(换句话说,它是一个生成器,适用于所有类型的序列,包括其他生成器):
import itertools
def paginate(iterable, page_size):
while True:
i1, i2 = itertools.tee(iterable)
iterable, page = (itertools.islice(i1, page_size, None),
list(itertools.islice(i2, page_size)))
if len(page) == 0:
break
yield page
Run Code Online (Sandbox Code Playgroud)
一些例子:
In [61]: list(paginate(my_sequence, 3))
Out[61]: [['foo', 'bar', 'baz'], ['spam', 'eggs', 'cheese'], ['yogurt']]
In [62]: list(paginate(xrange(10), 3))
Out[62]: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16124 次 |
最近记录: |