2009-08-15 42 views
8

我一直在擺弄周圍使用Python了一下,我收集了,它的通常是更好的(或「Python化」)使用訪問在Python的與補償元素。在循環

for x in SomeArray: 

而不是更C風格

for i in range(0, len(SomeArray)): 

我確實看到這樣的好處,主要是乾淨的代碼,並使用漂亮map()和相關功能的能力。但是,我經常面臨的情況是,我想同時訪問陣列中不同偏移量的元素。例如,我可能想將當前元素添加到它後面兩個元素的元素。有沒有辦法做到這一點,而不訴諸明確的指數?

+1

請注意,範圍(0,len(SomeArray))等價於更常見的範圍(len(SomeArray))。 – EOL 2009-08-15 18:30:16

回答

14

在Python做到這一點的方法是:

for i, x in enumerate(SomeArray): 
    print i, x 

enumerate發生器產生的2元組,每個都包含數組索引和所述元件的序列。

+0

但是,我將如何訪問循環的一次迭代中的前一個/後續元素? – int3 2009-08-15 12:11:35

+0

在循環內部,您可以訪問SomeArray [i-1]或SomeArray [i + 1]。 – 2009-08-15 12:17:38

+0

'SomeArray [i-1]'?但你可能想解釋你在做什麼 – SilentGhost 2009-08-15 12:18:13

6

列表索引和zip()是你的朋友。

這裏是我送給你的更具體的問題的答案:

我可能要到當前的元素兩步添加到元素後面。有沒有辦法做到這一點,而不訴諸明確的指數?

arr = range(10) 
[i+j for i,j in zip(arr[:-2], arr[2:])] 

您還可以,如果你打算在數字陣列,而使用該模塊numpy。例如,上面的代碼可以更優雅寫成:

import numpy 
narr = numpy.arange(10) 
narr[:-2] + narr[2:] 

添加第n個元素到第(n-2)個元素等效於將第m個元素到第(m + 2)元素(數學上傾斜的,我們進行了替代n> m + 2)。 n的範圍是[2,len(arr)),m的範圍是[0,len(arr)-2)。請注意括號和括號。從0到len(arr)-3的元素(排除最後兩個元素)索引爲[:-2],而從2到len(arr)-1的元素(排除前兩個元素)索引爲[ 2:]。

我假設你已經知道列表解析。

+0

是的,我知道列表解析。雖然沒有真正使用它們。 zip()看起來像另一個不錯的解決方案,謝謝! – int3 2009-08-15 15:17:44