请参阅下面的代码示例中的 different approaches ,它可用于迭代列表和访问索引值以及 their performance metrics (我认为这对您有用):
from timeit import timeit
# Using range
def range_loop(iterable):
for i in range(len(iterable)):
1 + iterable[i]
# Using xrange
def xrange_loop(iterable):
for i in xrange(len(iterable)):
1 + iterable[i]
# Using enumerate
def enumerate_loop(iterable):
for i, val in enumerate(iterable):
1 + val
# Manual indexing
def manual_indexing_loop(iterable):
index = 0
for item in iterable:
1 + item
index += 1
请参阅以下每种方法的效果指标:
from timeit import timeit
def measure(l, number=10000):
print "Measure speed for list with %d items" % len(l)
print "xrange: ", timeit(lambda :xrange_loop(l), number=number)
print "range: ", timeit(lambda :range_loop(l), number=number)
print "enumerate: ", timeit(lambda :enumerate_loop(l), number=number)
print "manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number)
measure(range(1000))
# Measure speed for list with 1000 items
# xrange: 0.758321046829
# range: 0.701184988022
# enumerate: 0.724966049194
# manual_indexing: 0.894635915756
measure(range(10000))
# Measure speed for list with 100000 items
# xrange: 81.4756360054
# range: 75.0172479153
# enumerate: 74.687623024
# manual_indexing: 91.6308541298
measure(range(10000000), number=100)
# Measure speed for list with 10000000 items
# xrange: 82.267786026
# range: 84.0493988991
# enumerate: 78.0344707966
# manual_indexing: 95.0491430759
因此,使用 range 方法是最快列出1000个项目的方法 . 对于大小> 10 000项目的列表 enumerate 是赢家 .
这个问题的最佳解决方案是使用 enumerate in-build python函数 . enumerate 返回 tuple 第一个值是 index 第二个值是该索引处的数组 element
In [1]: ints = [8, 23, 45, 12, 78]
In [2]: for idx, val in enumerate(ints):
...: print(idx, val)
...:
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)
1
如果列表中没有重复值:
for i in ints:
indx = ints.index(i)
print(i,indx)
否则使用 enumerate .
for counter, value in enumerate(ints):
print(counter, value)
或使用以下:
for counter in range(len(ints)):
print(counter, ints[counter])
73
你也可以试试这个:
data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
a = (i, str(item).split('.'))
x.append(a)
for index, value in x:
print(index, value)
22 回答
要使用
for
循环打印列表推导中的(索引,值)元组:输出:
它也可以使用
index()
方法完成这里的索引从0开始 . 但是如果你需要从1开始,只需在
index()
方法中加1,如下所示您可以使用
index
方法EDIT 注释中突出显示如果
ints
中存在重复项,此方法不起作用,则下面的方法应适用于ints
中的任何值:或者
如果你想获得
ints
中的索引和值作为元组列表 .它在这个问题的选定答案中使用
enumerate
的方法,但是使用列表理解,使用更少的代码使其更快 .在迭代时使用
enumerate
获取元素的索引:请注意,Python的索引从零开始,因此您可以使用上面的0到4 . 如果您想要计数,1到5,请执行以下操作:
Unidiomatic控制流程
您要求的是Pythonic等效于以下内容,这是大多数低级语言程序员使用的算法:
或者在没有for-each循环的语言中:
或者有时在Python中更常见(但不常见):
使用枚举功能
Python的enumerate function通过隐藏索引的会计来减少视觉混乱,并将迭代封装到另一个迭代(一个
enumerate
对象)中,该迭代产生索引的两项元组和原始迭代将提供的项 . 看起来像这样:这个代码示例相当不错canonical示例代码之间的区别是Python的惯用语法和非代码的代码 . 惯用代码是复杂的(但并不复杂)Python,以其打算使用的方式编写 . 惯用语代码是该语言的设计者所期望的,这意味着通常这些代码不仅更具可读性,而且更高效 .
得到一个数
即使您不需要索引,但是您需要计算迭代次数(有时是可取的),您可以从
1
开始,最终的数字将是您的计数 .当你说你想从1到5时,计数似乎更符合你想要的(而不是索引) .
打破它 - 一步一步解释
要打破这些示例,请说我们有一个我们想要使用索引迭代的项目列表:
现在我们传递这个iterable来枚举,创建一个枚举对象:
我们可以从这个迭代中拉出第一个项目,我们将在
next
函数的循环中得到它:我们看到第一个索引
0
和第一个项目'a'
的元组:我们可以使用所谓的“sequence unpacking”从这个二元组中提取元素:
当我们检查
index
时,我们发现它引用第一个索引0,item
引用第一个项目'a'
.结论
Python索引从零开始
要在迭代迭代时从迭代中获取这些索引,请使用枚举函数
以惯用的方式使用枚举(以及元组解包)创建更易读和可维护的代码:
这样做:
根据这个讨论:http://bytes.com/topic/python/answers/464012-objects-list-index
循环计数器迭代
循环索引的当前惯用法使用内置的“范围”函数:
循环使用元素和索引可以通过旧的习语或使用新的“zip”内置函数[2]来实现:
要么
通过http://www.python.org/dev/peps/pep-0212/
使用附加的状态变量,例如索引变量(通常在C或PHP等语言中使用),被认为是非pythonic .
更好的选择是使用Python 2和3中提供的内置函数enumerate():
查看PEP 279了解更多信息 .
正如Python中的标准一样,有几种方法可以做到这一点 . 在所有示例中假设:
lst = [1, 2, 3, 4, 5]
1.使用枚举(被认为是最惯用的)
在我看来,这也是最安全的选择,因为已经消除了进入无限递归的可能性 . 项目及其索引都保存在变量中,无需编写任何其他代码来访问该项目 .
2.创建一个变量来保存索引(使用for)
3.创建一个变量来保存索引(使用时)
4.总有另一种方式
如前所述,还有其他方法可以做到这一点,这里没有解释,甚至可能在其他情况下应用更多 . 例如使用
itertools.chain
with for . 它比其他示例更好地处理嵌套循环 .在 Python 2.7 中访问循环中列表索引的最快方法是将range method用于小型列表,将enumerate method用于中型和大型列表 .
请参阅下面的代码示例中的 different approaches ,它可用于迭代列表和访问索引值以及 their performance metrics (我认为这对您有用):
请参阅以下每种方法的效果指标:
因此,使用
range
方法是最快列出1000个项目的方法 . 对于大小> 10 000项目的列表enumerate
是赢家 .添加以下一些有用的链接:
What is the difference between range and xrange functions in Python 2.X?
What is faster for loop using enumerate or for loop using xrange in Python?
range(len(list)) or enumerate(list)?
这个问题的最佳解决方案是使用 enumerate in-build python函数 .
enumerate 返回 tuple
第一个值是 index
第二个值是该索引处的数组 element
如果列表中没有重复值:
否则使用
enumerate
.或使用以下:
你也可以试试这个:
输出是
您可以使用以下代码执行此操作:
如果需要在循环结束时重置索引值,请使用此代码:
如果我要迭代nums = [1,2,3,4,5]我会这样做
或者得到长度为l = len(nums)
在你的问题,你写"how do I access the loop index, from 1 to 5 in this case?"
但是,列表的索引从零开始 . 那么,我们需要知道你真正想要的是列表中每个项目的索引和项目,或者你是否真的想要从1开始的数字 . 幸运的是,在python中很容易做到其中一个或两个 .
首先,为了澄清,枚举函数迭代地返回列表中每个项的索引和对应项 .
那么上面的输出是,
请注意,索引从0开始 . 这种索引在包括python和c在内的现代编程语言中很常见 .
如果希望循环跨越列表的一部分,则可以将标准python语法用于列表的一部分 . 例如,要从列表中的第二个项目循环到但不包括最后一个项目,您可以使用
请注意,输出索引再次从0开始,
这将我们带到enumerate()的start = n开关 . 这只是简单地抵消索引,你可以等效地简单地在循环内的索引中添加一个数字 .
输出为
您收到了许多解释
enumerate
的答案,但是如果您只需要索引来访问两个列表中的匹配条目,那么Python 3中的's another way that'更简洁,更简单:zip
.例如,如果您使用索引为列表中的数字提取相应的名称,则可以这样做:
这会产生
老式的方式:
列表理解:
从
1
开始它非常简单,而不是0
:注意
重要提示,虽然
index
之后有点误导,但这里会是tuple
(idx, item)
. 很高兴去 .我不知道以下是否是pythonic,但它使用Python函数
enumerate
并打印索引和值 .输出:
这很好地达到了目的:
这样您就可以扩展列表 . 扩展意味着您可以一次添加多个值 .
要附加此列表,您必须编写下面给出的代码:
这样,您可以一次添加一个值 . 如果你写
ints.append([1])
所以这将为这个元素创建一个子列表 .首先,索引将从0到4.编程语言从0开始计数;不要忘记,否则你会遇到索引超出范围的异常 . for循环中所需要的只是一个从0到4的变量,如下所示:
请记住,我写了0到5,因为循环在最大值之前停止了一个数字 . :)
获取索引使用的值