Comment découper une liste en Python 3?

J'ai trouvé le code suivant compatible avec python2

from itertools import izip_longest
def grouper(n, iterable, padvalue=None):
  "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
  return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

Cependant, cela ne fonctionne pas avec Python 3 . Je reçois l'erreur suivante

ImportError: cannot import name izip_longest

Quelqu'un Peut-il aider?

Je voudrais convertir ma liste de [1,2,3,4,5,6,7,8,9] à [[1,2,3],[4,5,6],[7,8,9]]

Modifier

Maintenant compatible Python3

Le Code ci-dessous est adapté de la réponse sélectionnée. Il suffit de changer le nom de izip_longest à zip_longest.

from itertools import zip_longest
def grouper(n, iterable, padvalue=None):
  "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
  return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
28
demandé sur Joze 2011-05-01 22:49:45

2 réponses

Dans itertools de Python 3, Il y a une fonction appelée zip_longest. Il devrait faire la même chose que izip_longest de Python 2.

Pourquoi le changement de nom? Vous remarquerez peut - être également que itertools.izip est maintenant parti en Python 3-c'est parce que dans Python 3, la fonction intégrée zip renvoie maintenant un itérateur, alors que dans Python 2 il renvoie une liste. Comme il n'y a pas besoin de la fonction izip, il est également logique de renommer la variante _longest pour plus de cohérence.

46
répondu Ben James 2011-05-01 18:57:30

Selon la doc:

>>> s = [1,2,3,4,5,6,7,8,9]
>>> n = 3
>>> list(zip(*[iter(s)]*n))
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
2
répondu Julien Palard 2017-06-12 11:27:09