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

时间:2016-07-28 11:30:30

标签: 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

3 个答案:

答案 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])元组列表。然后我们使用元组解包将每个元组的值分配给xy

您也可以使用内置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将从0size-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。只需使用rangexrange

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