我是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)
如果你真的想使用手动索引,那么就不要使用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])元组列表.然后我们使用元组解包来将每个元组的值分配给x和y.
但您也可以使用内置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尝试此代码的消息,您就会知道为什么......