如何访问索引本身以获取如下列表?
ints = [8, 23, 45, 12, 78]
当我使用一个循环它 for
循环,如何访问循环索引,在这种情况下从1到5?
如何访问索引本身以获取如下列表?
ints = [8, 23, 45, 12, 78]
当我使用一个循环它 for
循环,如何访问循环索引,在这种情况下从1到5?
使用附加的状态变量,例如索引变量(通常在C或PHP等语言中使用),被认为是非pythonic。
更好的选择是使用内置函数 enumerate()
,在Python 2和3中均可用:
for idx, val in enumerate(ints):
print(idx, val)
查看 PEP 279 更多。
使用附加的状态变量,例如索引变量(通常在C或PHP等语言中使用),被认为是非pythonic。
更好的选择是使用内置函数 enumerate()
,在Python 2和3中均可用:
for idx, val in enumerate(ints):
print(idx, val)
查看 PEP 279 更多。
使用for循环,如何访问循环索引,在这种情况下从1到5?
使用 enumerate
在迭代时获取元素的索引:
for index, item in enumerate(items):
print(index, item)
请注意,Python的索引从零开始,因此您可以使用上面的0到4。如果您想要计数,1到5,请执行以下操作:
for count, item in enumerate(items, start=1):
print(count, item)
您要求的是Pythonic等效于以下内容,这是大多数低级语言程序员使用的算法:
index = 0 # Python's indexing starts at zero for item in items: # Python's for loops are a "for each" loop print(index, item) index += 1
或者在没有for-each循环的语言中:
index = 0 while index < len(items): print(index, items[index]) index += 1
或者有时在Python中更常见(但不常见):
for index in range(len(items)): print(index, items[index])
Python的 enumerate
功能 通过隐藏索引的会计,并将迭代封装到另一个迭代中来减少视觉混乱(一个 enumerate
object),它产生索引的两项元组和原始iterable将提供的项。看起来像这样:
for index, item in enumerate(items, start=0): # default is zero
print(index, item)
这段代码样本相当不错 典范 Python的惯用代码与非代码的代码之间的区别示例。惯用代码是复杂的(但并不复杂)Python,以其打算使用的方式编写。惯用语代码是该语言的设计者所期望的,这意味着通常这些代码不仅更具可读性,而且更高效。
即使你不需要索引,但是你需要计算迭代次数(有时是可取的),你可以从这开始 1
最后的号码将是你的计数。
for count, item in enumerate(items, start=1): # default is zero
print(item)
print('there were {0} items printed'.format(count))
当你说你想从1到5时,计数似乎更符合你想要的(而不是索引)。
要打破这些示例,请说我们有一个我们想要使用索引迭代的项目列表:
items = ['a', 'b', 'c', 'd', 'e']
现在我们传递这个iterable来枚举,创建一个枚举对象:
enumerate_object = enumerate(items) # the enumerate object
我们可以从这个迭代中拉出第一个项目,我们将在循环中得到 next
功能:
iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)
我们看到我们得到了一个元组 0
,第一个索引,和 'a'
,第一项:
(0, 'a')
我们可以使用所谓的“序列拆包“从这个二元组中提取元素:
index, item = iteration
# 0, 'a' = (0, 'a') # essentially this.
当我们检查 index
,我们发现它指的是第一个索引0和 item
是指第一项, 'a'
。
>>> print(index)
0
>>> print(item)
a
这样做:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)
从它开始它非常简单 1
以外 0
:
for index, item in enumerate(iterable, start=1):
print index, item
重要提示,虽然有点误导 index
将是一个 tuple
(idx, item)
这里。
很高兴去。
for i in range(len(ints)):
print i, ints[i]
正如Python中的标准一样,有几种方法可以做到这一点。在所有示例中假设: lst = [1, 2, 3, 4, 5]
for index, element in enumerate(lst):
# do the things that need doing here
在我看来,这也是最安全的选择,因为已经消除了进入无限递归的可能性。项目及其索引都保存在变量中,无需编写任何其他代码 访问该项目。
for
)for index in range(len(lst)): # or xrange
# you will have to write extra code to get the element
while
)index = 0
while index < len(lst):
# you will have to write extra code to get the element
index += 1 # escape infinite recursion
如前所述,还有其他方法可以做到这一点,这里没有解释,甚至可能在其他情况下应用更多。 例如 运用 itertools.chain
与...它比其他示例更好地处理嵌套循环。
老式的方式:
for ix in range(len(ints)):
print ints[ix]
列表理解:
[ (ix, ints[ix]) for ix in range(len(ints))]
>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
...
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
... print tup
...
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>>
在循环中访问列表索引的最快方法 Python 2.7 就是用 范围方法 对于小名单和 枚举方法 适用于中型和大型列表。
请参见 不同的方法 可用于迭代列表和访问索引值和 他们的绩效指标 (我认为对你有用)在下面的代码示例中:
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
是赢家。
添加以下一些有用的链接: