web-dev-qa-db-fra.com

Fractionner une liste python en d'autres "sous-listes", c.-à-d. De plus petites listes

J'ai une liste python qui peut contenir des milliers. Quelque chose comme:

data=["I","am","a","python","programmer".....]

où, len (données) = disons 1003

Je voudrais maintenant créer un sous-ensemble de cette liste (données) en scindant la liste originale en morceaux de 100. Donc, à la fin, je voudrais avoir quelque chose comme:

data_chunk1=[.....] #first 100 items of list data
data_chunk2=[.....] #second 100 items of list data
.
.
.
data_chunk11=[.....] # remainder of the entries,& its len <=100, len(data_chunk_11)=3

Existe-t-il un moyen pythonique pour accomplir cette tâche? Évidemment, je peux utiliser des données [0: 100] et ainsi de suite, mais je suppose que c'est terriblement non pythonique et très inefficace.

Merci beaucoup.

157
JohnJ

Je dirais

chunks = [data[x:x+100] for x in range(0, len(data), 100)]

Si vous utilisez python 2.x au lieu de 3.x, vous pouvez utiliser plus efficacement votre mémoire en utilisant xrange(), en remplaçant le code ci-dessus par:

chunks = [data[x:x+100] for x in xrange(0, len(data), 100)]
286
DanRedux

En fait, je pense que l'utilisation de tranches simples est la meilleure solution dans ce cas:

for i in range(0, len(data), 100):
    chunk = data[i:i + 100]
    ...

Si vous voulez éviter de copier les tranches, vous pouvez utiliser itertools.islice(), mais cela ne semble pas nécessaire ici.

La documentation itertools() contient également le célèbre motif "grouper":

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

Vous auriez besoin de le modifier pour traiter correctement le dernier bloc. Je pense donc que la solution simple utilisant des tranches simples est préférable.

29
Sven Marnach
chunks = [data[100*i:100*(i+1)] for i in range(len(data)/100 + 1)]

Ceci est équivalent à la réponse acceptée. Par exemple, raccourcir à 10 lots pour plus de lisibilité:

data = range(35)
print [data[x:x+10] for x in xrange(0, len(data), 10)]
print [data[10*i:10*(i+1)] for i in range(len(data)/10 + 1)]

Les sorties:

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]
10
inspectorG4dget