Если вы пытаетесь собрать вещи в группы из 4 строк, функция grouper
в itertools
recipes делает это тривиальным:
groups = grouper(4, file)
Это возвращает вам итерацию итераций — в частности, izip
ленивый итератор по tuple
s. Если вам конкретно нужен список списков, вам нужно сделать что-то вроде:
groups = [list(group) for group in grouper(4, file)]
Поскольку рецепты не являются частью модуля стандартной библиотеки, вам нужно либо скопировать и вставить функцию из документации, либо установить сторонний модуль с именем more_itertools
.
Если вы хотите что-то немного другое... ну, трудно точно знать, как это закодировать, не зная точно, что вы хотите, но вы, вероятно, найдете это в itertools
.
Например, допустим, вы хотите разбить его на группы, разделенные линиями, которые представляют собой не что иное, как пробелы. Я почти уверен, что в more_itertools
есть функция, которая делает это за вас, но вы можете довольно легко написать ее сами.
Во-первых, вы можете использовать groupby
для группировки строк по они все пробелы:
groups = itertools.groupby(file, lambda line: not line.strip())
Но groupby
возвращает key, group
пар. Вам нужен только group
без key
. И вам также нужны только группы непустых строк, а не все группы.
groups = [group for empty, group
in itertools.groupby(file, lambda line: not line.strip())
if not empty]
Или, если вам явно нужен список списков, а не какой-то произвольный итерируемый тип (в данном случае список _grouper
ленивых итераций):
groups = [list(group) for empty, group
in itertools.groupby(file, lambda line: not line.strip())
if not empty]
Если вы посмотрите на документы groupby
, примеры на самом деле очень близки к этому.
Я бы, вероятно, выделил lambda line: not line.strip()
в функцию (или использовал more_functools.negate(line.strip)
, или…) и записал ее в виде двух или трех строк вместо того, чтобы втискивать ее в большой список, но если вам нужно однострочное понимание списка (и 98-символьная строка приемлема), вот и все.
person
abarnert
schedule
01.04.2013
itertools
— это то, что вам нужно. Либо функцияgrouper
из рецептов в документации, либо тривиальная однострочная запись вокругgroupby
. - person abarnert   schedule 02.04.2013