我是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发布于 2016-07-28 11:39:49
如果您真的想使用手动索引,那么就不要使用enumerate(),只需创建一个大小合适的range() (或者xrange() (如果Python2.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)将构建一个(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:]))这是一种得到任何序列或可迭代的最小值的节奏式方法。
请注意,使用Python2.x,如果您的实际列表实际上要大得多,那么使用itertools.izip而不是zip会使您受益
顺便指出,使用min (实际上使用任何内置名称)作为变量名可能不是一个好主意,因为它将内置的内容隐藏在当前的命名空间中。如果你收到一条TypeError: 'int' object is not callable消息尝试这段代码,你就会知道为什么.
发布于 2016-07-28 11:32:51
可以将具有指定开始和停止索引的a片段传递给enumerate。
for i, x in enumerate(a[:size-1]):
...i将从0运行到size-2
另外,Python中的注释以#而不是//开头。
您可以通过使用min对从zip of a及其高级切片创建的生成器表达式实现相同的结果。
minimum = min(abs(i - j) for i, j in zip(a, a[1:]))另外,请注意不要使用名称min,因为这已经隐藏了内置的min。你显然不想要的东西。
发布于 2016-07-28 11:39:50
你可以直接切a。然后enumerate(a[:-1])将忽略a末尾的一个元素。
您甚至不再需要计算size了!
更重要的是,由于在x中不使用i, x,所以不需要enumerate。只需使用range或xrange
for i in xrange(len(a)-1):
....https://stackoverflow.com/questions/38635088
复制相似问题