首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环中为列表定义索引范围

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

Stack Overflow用户
提问于 2016-07-28 11:30:29
回答 3查看 6.4K关注 0票数 2

我是Python的完全初学者。我正在编写“数组元素之间的最小差”问题。其思想是对数组进行排序,然后查找相邻元素之间的差异,以找到差异最小的元素。

但是,我想知道如何在for循环中定义列表索引的范围,这样我的索引就不会超过size-2

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

发布于 2016-07-28 11:39:49

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

代码语言:javascript
运行
复制
for i in xrange(len(a) - 2):
   # code here

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

代码语言:javascript
运行
复制
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)函数来代替:

代码语言:javascript
运行
复制
min(abs(x - y) for x, y in zip(a, a[1:]))

这是一种得到任何序列或可迭代的最小值的节奏式方法。

请注意,使用Python2.x,如果您的实际列表实际上要大得多,那么使用itertools.izip而不是zip会使您受益

顺便指出,使用min (实际上使用任何内置名称)作为变量名可能不是一个好主意,因为它将内置的内容隐藏在当前的命名空间中。如果你收到一条TypeError: 'int' object is not callable消息尝试这段代码,你就会知道为什么.

票数 5
EN

Stack Overflow用户

发布于 2016-07-28 11:32:51

可以将具有指定开始和停止索引的a片段传递给enumerate

代码语言:javascript
运行
复制
for i, x in enumerate(a[:size-1]):
    ...

i将从0运行到size-2

另外,Python中的注释以#而不是//开头。

您可以通过使用min对从zip of a及其高级切片创建的生成器表达式实现相同的结果。

代码语言:javascript
运行
复制
minimum = min(abs(i - j) for i, j in zip(a, a[1:]))

另外,请注意不要使用名称min,因为这已经隐藏了内置的min。你显然不想要的东西。

票数 3
EN

Stack Overflow用户

发布于 2016-07-28 11:39:50

你可以直接切a。然后enumerate(a[:-1])将忽略a末尾的一个元素。

您甚至不再需要计算size了!

更重要的是,由于在x中不使用i, x,所以不需要enumerate。只需使用rangexrange

代码语言:javascript
运行
复制
for i in xrange(len(a)-1):
    ....
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38635088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档