2017-03-08 97 views
2

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

对于每次迭代,应该提取三个元素=>那些是i,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 
+1

'因为我在x范围(0,LEN(data_train_output_full)-1,3):'将正确停止,但你仍然有'data_train_output_full [I + 1],data_train_output_full [i + 2]',即i + 1和i + 2指数。也许你想'我在xrange(0,len(data_train_output_full)-3,3):' – roganjosh

+0

'data_train_output_full'的长度是多少?如果不知道这一点,很难给出明确的答案。 – spicypumpkin

+0

@roganjosh:我认为你只需要'len(...) - 2',而不是'-3'。 'xrange'中的最后一个元素永远不会生成,所以最后的'i'值将是'len(...) - 3',您可以安全地添加两个。 – Blckknght

回答

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,) 
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

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))