Python 一次使用一个子列表循环列表

Python 一次使用一个子列表循环列表,python,Python,我想在子列表中循环。我通过执行以下代码来实现它 def batchGenerator(samples, subsetSize): i=0 while (i < (len(samples) - subsetSize + 1)): yield samples[i: i + subsetSize] i = i + subsetSize 输出: 9 19 29 39 49 59 69 79 89 99 编辑: 我希望小于subsetSize的尾部

我想在子列表中循环。我通过执行以下代码来实现它

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

9
19
29
39
49
59
69
79
89
99
编辑:

我希望小于
subsetSize
的尾部元素被截断,我发现@s3cur3解决方案在这种情况下是最优雅的(与类似线程中的解决方案相比:)

我还希望输出保持相同的类型,
list
numpy.array
torch.Tensor
,等等

如何:

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]

是的可能重复它非常相似,但解决方案对我不起作用,因为我想截断小于
subsetSize
Yes的最后一个元素。这也有效。如果没有
yield
,它的内存效率会更低吗?我也更喜欢我的函数,因为它更适用于
numpy
数组,PyTorch
Tensor
,而无需将类型更改为
列表
啊,没错!我编辑了答案以返回生成器而不是列表。我相信这应该与您提到的其他(非
列表
)类型兼容。这非常好!考虑到还没有现有的库函数,这个解决方案看起来是最优雅的。我将其标记为正确答案我们如何将其推广到多个输入?类似于batchGenerator((样本\特征,样本\标签),子集大小)
def batchGenerator(listOfSampleLists, subsetSize):
    for sampleList in listOfSampleLists:
        for i in range(0, len(sampleList), subsetSize):
            yield sampleList[i:i+subsetSize]