2017-06-20 6 views
1
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

このリストを制約付きでチャンク/ページ分割するにはどうすればよいですか?私のページサイズが3で、ページごとに2つだけ割り切れる数字がほしいと言うことができます。制約付きのチャンクまたはページ番号

chunks = [[2,4,6],[8,10,12],[14]] 

変更: それは我々が呼び出しごとに1ページ/チャンクを生成しないか、ページ区切りなので。 PAGE_NUMBER = 2:または他の言葉で、私はPAGE_NUMBERはあなたが、例えばのために要求しているページです

def paginate(my_list, row_len, page_number=1): 

を取るのpaginateと呼ばれる機能を持って言うことができます。特殊なケース:あなたはすべてのページを取得したい場合は、設定PAGE_NUMBER = 0

この関数は以下のように呼び出すことができます。

paginate(my_list, 3, 2) # [8,10,12] 
paginate(my_list, 3, 0) # [[2,4,6],[8,10,12],[14]] 
+0

あなたは、より具体的に必要な出力の完全な作業例を与えることができます。 –

答えて

0

more-itertools

import more_itertools 

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

temp = [num for num in my_list if num % 2 == 0] 

list(more_itertools.chunked(temp, 3)) 

[[2, 4, 6], [8, 10, 12], [14]] 
と呼ばれるサードパーティのライブラリを使用することができます

はここlink for more-itertools

+0

サードパーティのライブラリへのリンクを追加することができます。 –

+0

よろしくお願いします –

1

はその後、偶数用発電を作成しているチャンクその後

# Python 2 

gen = (x for x in my_list if x%2==0) 
chunks = [[i for i in t if i is not None] for t in map(None, *(gen,)*3)] 
print chunks 
# [[2, 4, 6], [8, 10, 12], [14]] 

あなたは、唯一の最後のチャンクのチェックや交換を行うことにより、Noneための唯一の可能な場所をNoneをフィルタリングするために全体を反復処理を避けることができます:

gen = (x for x in my_list if x%2==0) 
chunks = map(None, *(gen,)*3) 
if None in chunks[-1]: 
    chunks[-1] = filter(None, chunks[-1]) 
print(chunks) 
# [(2, 4, 6), (8, 10, 12), (14,)] 
パイソン3、 map(None, ...)

最短チャンクがAPである保証するitertools.zip_longestと置き換えることができます単純に最短のiterableの長さで停止zipとは対照的に、None秒で保留:

from itertools import zip_longest 

gen = (x for x in my_list if x%2==0) 
chunks = [[i for i in t if i is not None] for t in zip_longest(*(gen,)*3)] 
print(chunks) 
# [[2, 4, 6], [8, 10, 12], [14]] 
関連する問題