查询来自多个阵列的数据

时间:2014-12-01 07:41:01

标签: algorithm

我有像:

这样的数组

[ 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一样,我可以获得起始索引和结束索引来直接获取数据。提前谢谢!


| 1 | 2 | 3 | 4 | 5 | 6 |

| 11 | 22 | 33 |

| 62 | 63 | 64 | 65 | 66 | 67 |

非常感谢,@ Aristide!这对我有很大帮助。实际上,我的数组是非常大的数组,因此更好的解决方案是直接获取给定页面数据结果。就像给出页面2一样,有没有办法获取第2页上的元素,而不是逐个实现第一页的元素来获取第二页。

谢谢,@阿里斯蒂德!根据我上面的描述,可能会误导读者。我的输入数组


| 1 | 2 | 3 | 4 | 5 | 6 |

| 11 | 22 | 33 |

| 62 | 63 | 64 | 65 | 66 | 67 |

给出页面2,直接返回页面2元素,避免逐个计算第一页元素!所以结果/输出应该是: [ 63,3,33,64,4 ]

1 个答案:

答案 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]
[]
[]