Получать несколько объектов одновременно из повторяемого объекта? - PullRequest
4 голосов
/ 04 февраля 2010

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

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

Ответы [ 2 ]

7 голосов
/ 04 февраля 2010

Ваш вопрос немного расплывчат, но посмотрите рецепт 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 голосов
/ 04 февраля 2010

Вот еще один подход, который работает на старых версиях 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 элементов.

...