defchunks(lst, n): """Yield successive n-sized chunks from lst.""" for i in xrange(0, len(lst), n): yield lst[i:i + n]
Ниже приведен однострочный способ понимания списка. Однако приведенный выше метод предпочтительнее, поскольку использование именованных функций упрощает понимание кода. Для Python 3:
[lst[i:i + n] for i inrange(0, len(lst), n)]
Для Python 2:
[lst[i:i + n] for i in xrange(0, len(lst), n)]
Ответ 2
Что-то очень простое:
defchunks(xs, n): n = max(1, n) return (xs[i:i+n] for i inrange(0, len(xs), n))
Для Python 2 используйте xrange() вместо range().
Ответ 3
Я знаю, что это довольно старое решение, но о нем еще никто не упоминал numpy.array_split:
#from itertools import izip_longest as zip_longest # for Python 2.x from itertools import zip_longest # for Python 3.x #from six.moves import zip_longest # for both (uses the six compat library)
Я предполагаю, что машина времени Гвидо работает — работала - будет работать — уже работала - снова работала.
Эти решения работают, потому что [iter(iterable)]*n (или эквивалент в более ранней версии) создает один итератор, повторяющийся n раз в списке. izip_longest затем эффективно выполняет циклический перебор "каждого" итератора; поскольку это один и тот же итератор, он расширяется каждым таким вызовом, в результате чего каждый такой zip-roundrobin генерирует один кортеж из n элементов.