Python for循环迭代步骤3

时间:2017-03-08 21:44:53

标签: python list for-loop

这可能是一个简单的问题,但我似乎花了太多时间在它上面......我的问题包括创建一个迭代列表的for循环。

对于每次迭代,应提取三个元素=>那些是我,i + 1和i + 2。但由于某种原因,我无法在没有退出索引之类的情况下迭代列表?...

我目前正在迭代的方式如下:

        for i in xrange(0,len(data_train_output_full)-1,3):
            data = np.array([data_train_output_full[i],data_train_output_full[i+1],data_train_output_full[i+2]])
            data_train_output.append(data)

我得到的错误信息是:

IndexError: index 278 is out of bounds for axis 0 with size 278

3 个答案:

答案 0 :(得分:1)

您的代码无效,因为您向stop提供的xrange值不正确。由于您在xrange提供的最高索引之后检查两个索引,因此您需要从输入序列的长度中减去两个(len(data_train_output_full)-2而不是-1)。

这种迭代还有一个itertools recipe

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

如果您的列表可能不均衡,并且您希望跳过最后一个值而不是填充,则可以使用itertools.izip代替itertools.izip_longest

答案 1 :(得分:0)

您总是可以使用itertools.islice理想地为此编写快速生成器。

In [1]: x = list(range(28))

In [2]: def by_triples(iterable):
    ...:     it = iter(iterable)
    ...:     triple = tuple(itertools.islice(it, 3))
    ...:     while triple:
    ...:         yield triple
    ...:         triple = tuple(itertools.islice(it, 3))
    ...:
    ...:

In [3]: import itertools

In [4]: for trip in by_triples(x):
    ...:     print(trip)
    ...:
(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, 10, 11)
(12, 13, 14)
(15, 16, 17)
(18, 19, 20)
(21, 22, 23)
(24, 25, 26)
(27,)

答案 2 :(得分:0)

我想出了这个替代解决方案:

def by_n(a_list, n):
    for i in xrange(0, len(a_list), n): 
        yield a_list[i:i+n]

data_train_output = [np.array(_) for _ in by_n(data_train_output_full, 3)]

# or

data_train_output = list(map(np.array, by_n(data_train_output_full, 3))