Умножить сразу несколько объектов из итерируемого объекта?

Как я могу предоставить несколько элементов за раз из итерируемого объекта?

Например, с последовательностью произвольной длины, как я могу перебирать элементы в последовательности в группах из X последовательных элементов на итерацию?

Ответ 1

Ваш вопрос немного расплывчатый, но ознакомьтесь с рецептом grouper в документации itertools.

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

(Замена одного и того же итератора несколько раз с помощью [iter(iterable)]*n - это старый трюк, но инкапсуляция в эту функцию позволяет избежать запутанного кода, и это точная форма и интерфейс, которые многие люди будут использовать. немного стыдно, что он фактически не находится в модуле itertools.)

Ответ 2

Вот еще один подход, который работает на более старой версии Python, у которой нет izip_longest:

def grouper(n, seq):
  result = []
  for x in seq:
    result.append(x)
    if len(result) >= n:
      yield tuple(result)
      del result[:]
  if result:
    yield tuple(result)

Нет наполнителя, поэтому в последней группе может быть меньше n элементов.