为for循环中的列表定义索引的范围

sag*_*van 2 python arrays

我是Python的初学者.我正在编码"数组元素之间的最小差异"问题.我们的想法是对数组进行排序,然后找出相邻元素之间的差异,找到具有最小差异的元素.

但是,我想知道如何在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
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 5

如果你真的想使用手动索引,那么就不要使用enumerate(),只需创建一个合适大小的range()(或者xrange()如果是Python 2.x),即:

for i in xrange(len(a) - 2):
   # code here
Run Code Online (Sandbox Code Playgroud)

现在你根本不需要手动处理索引 - 如果你想迭代(a[x], a[x+1]) 对所有你需要的是zip():

for x, y in zip(a, a[1:]):
   if abs(x - y) < min:
       min = abs(x - y)
Run Code Online (Sandbox Code Playgroud)

zip(seq1, seq2)将构建一个(seq1[i], seq2[i])元组列表(当最小序列或迭代器耗尽时停止).使用a[1:]第二个序列,我们将有一个(a[i], a[i+1])元组列表.然后我们使用元组解包来将每个元组的值分配给xy.

您也可以使用内置min(iterable)函数:

min(abs(x - y) for x, y in zip(a, a[1:]))
Run Code Online (Sandbox Code Playgroud)

这是获得任何序列的最小值或可迭代的pythonic方法.

请注意,使用Python 2.x,如果您的真实列表实际上更大,您将从使用itertools.izip而不是使用zip

作为旁注,使用min(实际上使用任何内置名称)作为变量名称可能不是一个好主意,因为它会影响当前命名空间中的内置.如果您收到TypeError: 'int' object is not callable尝试此代码的消息,您就会知道为什么......