Я хочу зациклить подсписки. Я добиваюсь этого, выполняя следующий код.

def batchGenerator(samples, subsetSize):
    i=0
    while (i < (len(samples) - subsetSize + 1)):
        yield samples[i: i + subsetSize]
        i = i + subsetSize

Есть ли более стандартная библиотечная функция для того же?

Я хочу использовать это как:

for subl in batchGenerator(range(100), 10):
    print (max(subl))

Выход:

9
19
29
39
49
59
69
79
89
99

Редактировать:

Я хочу, чтобы конечные элементы, размер которых меньше subsetSize, были усечены, и я считаю решение @ s3cur3 наиболее элегантным для этого случая (по сравнению с решениями в аналогичном потоке: Какой самый" питонический "способ перебора списка в кусках?)

Я также предпочитаю, чтобы вывод оставался одного типа: list, numpy.array, torch.Tensor и т. Д.

1
user7867665 21 Ноя 2018 в 18:13

1 ответ

Лучший ответ

Как насчет:

def batchGenerator(samples, subsetSize):
    return (samples[i:i+subsetSize] for i  in range(0, len(samples), subsetSize))

Вызов range() здесь позволяет выполнять итерацию до длины вашего списка, переходя subsetSize за раз (таким образом, вы получаете i из 0, 10, 20, ..., 90 в вашем примере).

Изменено в ответ на комментарий :

Если вы хотите, чтобы ввод был списком списков, вам нужно использовать синтаксис генератора, подобный этому:

def batchGenerator(listOfSampleLists, subsetSize):
    for sampleList in listOfSampleLists:
        for i in range(0, len(sampleList), subsetSize):
            yield sampleList[i:i+subsetSize]
2
s3cur3 27 Ноя 2018 в 19:42