シンプルに1商品のみで考えます。
また、各店舗は金額の低い順で返すものとし、ページネーションにも対応しているとします。
ただし、結果として出力したい順をAPIで指定できるのであれば、どんな順番でもよいです。
どのような順番であれ、各店舗のAPIは最大でもページネーションに必要な件数のみ取得すればよいでしょう。
その結果を並び替えて保持しておけばよいです。
ページネーションの結果、そのページ表示に足りなくなれば、その都度各APIから次のページ分を取得すればよいです。
以下、模擬コードです。
なお、このコードでは各ページにおいて厳密に金額の昇順の結果を返しません。
(たとえば3ページ目と4ページ目の結果など)
ちゃんとやろうとすれば、各APIの結果の最小値>現結果リストの最大値となるまで各API結果を取得しておく必要があります。
Python
1import random
2import pprint
3
4random.seed(110)
5
6N_API = 3 # 各APIからの結果数
7N_RET = 5 # 結果として返すページ当たりの件数
8
9# 各API。呼び出し毎に金額の低い順にN_API個の値を返す
10def api():
11 i = 0
12 while True:
13 l = []
14 for _ in range(N_API):
15 i = i + random.randint(0,10)
16 l.append(i)
17 yield l
18
19# 各API
20apis = [('ama', api()), ('rak', api()), ('yah', api())]
21
22# 各APIから必要な数の結果を返す
23# 必要な数:各APIともに最低N_RETだけあればよい
24def get_api_list():
25 lst = []
26 for api in apis:
27 api_ret = []
28 while len(api_ret) < N_RET:
29 api_ret += [(api[0],v) for v in api[1].__next__()]
30 lst += api_ret
31 return lst
32
33lst = []
34for i in range(10): # 適当な回(ページ)数
35
36 # ページ表示に必要な件数を割った
37 if len(lst) < N_RET:
38 lst += get_api_list()
39 lst.sort(key=lambda x:x[1])
40
41 top = lst[:N_RET]
42 print('-----')
43 pprint.pprint(top)
44 lst = lst[N_RET:]
結果例
-----
[('yah', 5), ('yah', 5), ('ama', 6), ('yah', 6), ('rak', 10)]
-----
[('yah', 14), ('ama', 15), ('yah', 15), ('yah', 17), ('ama', 18)]
-----
[('rak', 18), ('rak', 19), ('ama', 24), ('rak', 27), ('ama', 31)]
-----
[('yah', 25), ('yah', 26), ('yah', 32), ('rak', 33), ('ama', 35)]
-----
[('yah', 40), ('rak', 41), ('ama', 42), ('yah', 47), ('rak', 51)]
-----
[('yah', 51), ('ama', 52), ('ama', 52), ('rak', 54), ('rak', 58)]
-----
[('ama', 60), ('rak', 62), ('ama', 66), ('rak', 67), ('rak', 72)]
-----
[('yah', 56), ('yah', 61), ('yah', 64), ('yah', 66), ('yah', 70)]
-----
[('yah', 72), ('ama', 75), ('rak', 75), ('rak', 77), ('rak', 84)]
-----
[('ama', 85), ('ama', 87), ('rak', 87), ('rak', 88), ('ama', 90)]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/17 11:05
2020/08/17 11:08 編集
2020/08/17 11:14
2020/08/17 11:30 編集