2017-03-08 72 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))