2016-07-28 88 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): 
    ....