2010-09-13 4 views
4

Je veux diviser ma liste en lignes qui ont toutes le même nombre de colonnes, je cherche la meilleure façon (la plus élégante/pythonique) d'y parvenir :Python: diviser la liste en blocs de taille définie et remplir le reste

>>> split.split_size([1,2,3], 5, 0) 
[[1, 2, 3, 0, 0]] 

>>> split.split_size([1,2,3,4,5], 5, 0) 
[[1, 2, 3, 4, 5]] 

>>> split.split_size([1,2,3,4,5,6], 5, 0) 
[[1, 2, 3, 4, 5], [6, 0, 0, 0, 0]] 

>>> split.split_size([1,2,3,4,5,6,7], 5, 0) 
[[1, 2, 3, 4, 5], [6, 7, 0, 0, 0]] 

C'est ce que je suis venu avec à ce jour:

def split_size(l, size, fillup): 
    """ 
    splits list into chunks of defined size, fills up last chunk with fillup if below size 
    """ 
    # len(l) % size or size 
    # does i.e. size=5: 3->2, 4->1, 5->0 
    stack = l + [fillup] * (size - (len(l) % size or size)) 
    result = [] 
    while len(stack) > 0: 
     result.append(stack[:5]) 
     del stack[:5] 
    return result 

Je suis sûr qu'il doit y avoir des solutions plus intelligentes. Surtout pour la partie "mod inverse": len (l)% taille ou taille il faut être un moyen plus lisible de le faire, non?

+0

double: http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized -chunks-in-python – volting

+0

duplication possible de [Quelle est la manière la plus "pythonique" d'itérer sur une liste en morceaux?] (http://stackoverflow.com/questions/434287/what-is-the-most-pythonic -way-to-iterate-over-a-list-in-chunks) – NullUserException

+0

@Volting: J'ai vu cette autre question, elle est liée mais pas la même parce que je veux spécifier la taille de chaque split. – hansaplast

Répondre

6

Le itertools recipe mérou appelé fait ce que vous voulez:

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 
+0

['izip_longest()'] (http://docs.python.org/library/itertools.html#itertools.izip_longest) est nouveau dans la version 2.6 – NullUserException

+0

wow, en regardant la documentation izip_longest je n'aurais jamais pu trouver cela, merci beaucoup – hansaplast

Questions connexes