2016-07-28 86 views
2

我是一個完整的初學者,在Python。我編寫了「數組元素之間的最小差異」問題。這個想法是對數組進行排序,然後找出相鄰元素之間的差異,找到最小差異的數據。爲for循環中的列表定義索引的範圍

但是,我想知道如何定義for循環中列表的索引範圍,以便我的索引不超過size-2

import sys 

a=[34,56,78,32,97,123] 
a,size=sorted(a),len(a) 
min=sys.maxint 

for i,x in enumerate(a): # Need a range for index i from 0 to size-2 
    if(abs(a[i]-a[i+1])<min): 
     min=abs(a[i]-a[i+1]) 

print min 

回答

3

可以傳遞的a片與指定的開始和停止索引以enumerate

for i, x in enumerate(a[:size-1]): 
    ... 

i0運行size-2


在一個側面說明, Python中的註釋從#開始,而不是//


您可以通過從azip及其先進的片創建一個生成器表達式使用min獲得相同的結果:

minimum = min(abs(i - j) for i, j in zip(a, a[1:])) 

另外,注意不要使用名稱min因爲這已經影響了內建的min。你顯然不想要的東西。

+0

@BusyAnt不完全不好。 –

+2

'a [:size-1]'如果我是對的,則從0運行到'size-2'。 –

+1

技術上正確,但仍然完全unpythonic。這裏pythonic的方式是使用內置'min'函數和'zip' –

5

如果你真的想用手工索引,然後不使用enumerate(),只是創建一個range()(或xrange()如果Python的2.X)大小合適的,即:

for i in xrange(len(a) - 2): 
    # code here 

現在你不必須手動照顧指標在所有 - 如果你想遍歷(a[x], a[x+1])對所有你需要的是zip()

for x, y in zip(a, a[1:]): 
    if abs(x - y) < min: 
     min = abs(x - y) 

zip(seq1, seq2)將建成列表元組(當最小序列或迭代器耗盡時停止)。使用a[1:]作爲第二個序列,我們將有一個(a[i], a[i+1])元組列表。然後我們使用元組解包將元組的值分配給xy

,你也可以只使用內置min(iterable)函數:

min(abs(x - y) for x, y in zip(a, a[1:])) 

這是Python的方式獲得任何序列或迭代的最小值。

請注意,使用Python 2。X,如果你真正的名單實際上是更強壯,你會使用itertools.izip代替zip

至於作爲附帶說明,使用min(實際使用任何內建的名稱)作爲變量名是可能不是一個好主意,因爲受益它會在當前命名空間中隱藏內建。如果您收到一條TypeError: 'int' object is not callable消息,請嘗試使用此代碼,您將知道爲什麼...

+0

在循環中使用名字'min'不是一個好主意 –

+0

@MosesKoledoye我完全同意,但這是OP的代碼;) –

3

您可以只分片a。然後enumerate(a[:-1])將忽略a末尾的一個元素。你可以不用計算size了!

更如此,因爲您不使用xi, x,您不需要enumerate。只是使用rangexrange

for i in xrange(len(a)-1): 
    ....