Как сделать группы из пяти элементов из списка? - PullRequest
1 голос
/ 31 июля 2011

Мое приложение GAE получает несколько файлов при загрузке (может быть от 0 до N). У меня есть список в files_arguments список:

files_arguments = self.request.arguments()

Мне нужно взять первые 5 элементов, обработать их. Затем возьмите следующие 5 элементов и обработайте. И так далее. Последняя группа, конечно, может иметь менее 5 элементов.

Каким должен быть код для этого? (Я не буду использовать files_arguments после этого, поэтому элементы могут быть удалены из списка после обработки)

Ответы [ 4 ]

6 голосов
/ 31 июля 2011

Вот низкотехнологичный подход. Последняя группа не выбрасывается, если она меньше n.

n = 5
groups = [files_arguments[i:i + n] for i in range(0, len(files_arguments), n)]
3 голосов
/ 31 июля 2011

Как сказано в документации для zip,

Порядок вычисления итераций слева направо гарантирован.Это делает возможным создание кластера для ряда данных в группы n-длины, используя zip(*[iter(s)]*n).

Таким образом, полными группами являются zip(*[iter(files_arguments)]*5), а последняя короткая группа (если есть) - files_arguments[-len(files_arguments)%5:].

Ответ FMc проще и проще для понимания в этом случае, но я думаю, что идиома zip для группировки интересна, поэтому здесь стоит упомянуть.

1 голос
/ 19 августа 2011

Если вам нужен итератор, который возвращает полные заполненные списки:

def group(a, n=5, default=None):
  a = iter(a)
  while True: 
     yield [next(a)] + [next(a, default) for i in range(n-1)]

>>> list(group(range(8))
[[0, 1, 2, 3, 4], [5, 6, 7, None, None]]
1 голос
/ 31 июля 2011
def pickN( mylist, N=5 ):
    if ( len(mylistl) < N) return mylist
    a = mylist[0:N]
    for _ in range(N): mylist.pop(0)
    return a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...