我是 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
答案 0 :(得分:5)
如果你真的想使用手动索引,那么不要使用enumerate()
,只需创建一个合适大小的range()
(或xrange()
,如果是Python 2.x),即:< / p>
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)
将构建一个(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:]))
这是获取任何序列的最小值或可迭代的pythonic方法。
请注意,使用Python 2.x,如果您的真实列表实际上更大,那么使用itertools.izip
代替zip
正如旁注所示,使用min
(实际上使用任何内置名称)作为变量名称可能不是一个好主意,因为它会影响当前命名空间中的内置。如果您在尝试此代码时收到TypeError: 'int' object is not callable
消息,您就会知道原因......
答案 1 :(得分:3)
您可以将指定开始和结束索引的a
切片传递给enumerate
:
for i, x in enumerate(a[:size-1]):
...
i
将从0
到size-2
在旁注中,Python中的注释以#
而不是//
您可以对min
zip
及其高级切片创建的生成器表达式使用a
来获得相同的结果:
minimum = min(abs(i - j) for i, j in zip(a, a[1:]))
另外,请注意不要使用名称min
,因为这已经隐藏了内置min
。你显然不想要的东西。
答案 2 :(得分:3)
你可以切片a
。然后enumerate(a[:-1])
会忽略a
末尾的一个元素。
您甚至不需要再计算size
了!
更重要的是,由于您未在x
中使用i, x
,因此您不需要enumerate
。只需使用range
或xrange
:
for i in xrange(len(a)-1):
....