我有像:
这样的数组[ 1,2,3,4,5,6 ]
[ 11,22,33 ]
[ 62,63,64,65,66,67 ]
我需要通过分页从这些不同长度的数组中获取数据,例如,给出页面大小为5,结果页面应为: [ 1,11,62,2,22 ], [ 63,3,33,64,4 ], [ 65,5,66,6,67 ]
也就是说我根据数组中的数据索引对数据进行排序,并且数组的数量不限于3.
我的笨拙解决方案是遍历所有数组并将它们组合成一个新的数组,这是无效的。是否有更好,更有效的算法来获取没有组合/联合的页面数据。就像给出页面2一样,我可以获得起始索引和结束索引来直接获取数据。提前谢谢!
非常感谢,@ Aristide!这对我有很大帮助。实际上,我的数组是非常大的数组,因此更好的解决方案是直接获取给定页面数据结果。就像给出页面2一样,有没有办法获取第2页上的元素,而不是逐个实现第一页的元素来获取第二页。
谢谢,@阿里斯蒂德!根据我上面的描述,可能会误导读者。我的输入数组
给出页面2,直接返回页面2元素,避免逐个计算第一页元素!所以结果/输出应该是: [ 63,3,33,64,4 ]
答案 0 :(得分:1)
带有itertools
的Python 2.7,可直接访问page_index
页面(从零开始):
import itertools
def select_page(data, page_size, page_index):
def element_generator(x, y):
empty_row_count = 0
while empty_row_count < len(data):
if x < len(data[y]):
yield data[y][x]
empty_row_count = 0
else:
empty_row_count += 1
y += 1
if y == len(data):
y = 0
x += 1
# initialize the generator at the minimal possible coordinates
(x, y) = divmod(page_size * page_index, len(data))
elements = element_generator(x, y)
# drop as many elements than the number of gaps
for row in data:
list(itertools.islice(elements, max(0, x-len(row))))
# return the page_size next elements
return list(itertools.islice(elements, page_size))
一些测试,输入:
data = [
[ 1, 2, 3, 4, 5, 6 ],
[ 11, 22, 33 ],
[ 62, 63, 64, 65, 66, 67 ],
]
page_size = 5
for page_index in range(5):
print select_page(data, page_size, page_index)
输出:
[1, 11, 62, 2, 22]
[63, 3, 33, 64, 4]
[65, 5, 66, 6, 67]
[]
[]