Segmenter une liste en Python

je suis à la recherche d'une fonction (ou mécanisme) Python intégrée pour segmenter une liste en longueurs de segment requises (sans muter la liste d'entrée). Voici le code que j'ai déjà:

>>> def split_list(list, seg_length):
...     inlist = list[:]
...     outlist = []
...     
...     while inlist:
...         outlist.append(inlist[0:seg_length])
...         inlist[0:seg_length] = []
...     
...     return outlist
... 
>>> alist = range(10)
>>> split_list(alist, 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
8
demandé sur kjfletch 2009-08-02 16:14:15

3 réponses

Vous pouvez utiliser compréhension de liste:

>>> seg_length = 3
>>> a = range(10)
>>> [a[x:x+seg_length] for x in range(0,len(a),seg_length)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
17
répondu OmerGertel 2009-08-02 12:26:09

Comment devez-vous utiliser la sortie? Si vous avez seulement besoin d'itérer sur elle, vous êtes mieux de créer un itérable, un qui donne vos groupes:

def split_by(sequence, length):
    iterable = iter(sequence)
    def yield_length():
        for i in xrange(length):
             yield iterable.next()
    while True:
        res = list(yield_length())
        if not res:
            return
        yield res

exemple d'Utilisation:

>>> alist = range(10)
>>> list(split_by(alist, 3))
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

cela utilise beaucoup moins de mémoire que d'essayer de construire la liste entière en mémoire à la fois, si vous êtes seulement en boucle sur le résultat, parce qu'il ne construit qu'un sous-ensemble à la fois:

>>> for subset in split_by(alist, 3):
...     print subset
...
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
4
répondu Martijn Pieters 2016-11-01 17:40:21

pas la même sortie, je pense toujours que l' fonction de groupeur est utile:

from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return izip_longest(*args, fillvalue=fillvalue)

pour Python2.4 et 2.5, qui n'a pas izip_longest:

from itertools import izip, chain, repeat
def grouper(iterable, n, padvalue=None):
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)

certains le code de démonstration et de sortie:

alist = range(10)
print list(grouper(alist, 3))

sortie: [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, Aucun, Aucun)]

2
répondu sunqiang 2009-08-02 14:58:43