在Python中为'循环访问索引
如何访问索引本身的列表如下?
ints = [8, 23, 45, 12, 78]
当我循环使用for
循环时,如何访问循环索引,在这种情况下从1到5?
使用额外的状态variables,如索引variables(通常用于C或PHP等语言中),被认为是非pythonic。
更好的select是使用Python 2和3中提供的内置函数enumerate()
:
for idx, val in enumerate(ints): print(idx, val)
查看更多的PEP 279 。
使用for循环,在这种情况下,如何访问循环索引,从1到5?
使用enumerate
:
for index, item in enumerate(items): print(index, item)
并注意索引从零开始,所以你会得到这个0到4。 如果你想要点数,我在下面解释。
单向控制stream程
你所要求的是以下的Pythonic等价物,这是大多数低级语言的程序员所使用的algorithm:
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
对象)中来减less视觉混乱,该迭代器生成索引的两个项目元组以及原始迭代将提供的项目。 看起来像这样:
for index, item in enumerate(items, start=0): # default is zero print(index, item)
这个代码示例相当不错,是Python的惯用代码和不是代码之间区别的典型例子。 语言代码是复杂的(但不是复杂的)Python,按照它打算使用的方式编写。 该语言的devise者期望语言代码,这意味着通常这个代码不仅更具可读性,而且更高效。
得到一个计数
即使你不需要索引,但是你需要迭代的次数(有时是可取的),你可以从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']
现在我们通过这个迭代枚举,创build一个枚举对象:
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
结论
- Python索引从零开始
- 为了在遍历它时从迭代中获取这些索引,请使用枚举函数
- 以惯用的方式使用枚举(连同tuple拆包)创build更易读和可维护的代码:
所以这样做:
for index, item in enumerate(items, start=0): # Python indexes start at zero print(index, item)
从0
开始非常简单:
for index in enumerate(iterable, start=1): print index
注意
重要的提示,虽然有点误导,因为index
将在这里是一个tuple
(idx, item)
。 很好去。
for i in range(len(ints)): print i, ints[i]
老式的方式:
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) >>>
我不知道以下是pythonic,但它使用Python函数enumerate
并打印枚举数和值。
int_list = [8, 23, 45, 12, 78] for index in enumerate(int_list): print index (0, 8) (1, 23) (2, 45) (3, 12) (4, 78)
ints = [9, 23, 45, 12, 78] ints.extend([1,2,3,4,5,6,7,8]) for idx, val in enumerate(ints): print(idx,val)
这样你可以扩展一个列表。 扩展意味着您可以一次添加多个值。
要追加这个列表,你必须写下面给出的代码:
ints = [9, 23, 45, 12, 78] ints.append([1]) for idx, val in enumerate(ints): print(idx,val)
这样,您可以一次添加一个值。 如果您编写ints.append([1])
,则会为此元素创build一个子列表。
正如Python中的规范,有几种方法可以做到这一点。 在所有例子中假设: lst = [1, 2, 3, 4, 5]
1.使用枚举( 被认为是最习惯的 )
for index, element in enumerate(lst): # do the things that need doing here
在我看来,这也是最安全的select,因为进入无限recursion的机会已经被消除了。 项目及其索引都保存在variables中,不需要编写任何进一步的代码来访问项目。
2.使用列表的索引方法
for element in lst: index = lst.index(element) # and the rest
这只有在您的列表没有任何重复时才有效。 如果您需要访问每次迭代中的element
,也会很慢,因为每次使用索引都要search整个列表。
3.创build一个variables来保存索引( 使用 )
for index in range(len(lst)): # or xrange # you will have to write extra code to get the element
4.创build一个variables来保存索引( 使用while
)
index = 0 while index < len(lst): # you will have to write extra code to get the element index += 1 # escape infinite recursion
5.总有另一种方式
如前所述,还有其他方法可以做到这一点,这里没有解释,甚至可能在其他情况下应用更多。 例如使用itertools.chain
和for。 它比其他例子更好地处理嵌套循环。
首先,索引将从0到4.编程语言从0开始计数; 不要忘记,否则你会遇到一个索引超出界限例外。 所有你需要的for循环是一个从0到4的variables,如下所示:
for x in range(0, 5):
请记住,我写0到5,因为循环停止一个数字之前的最大值。 🙂
获得索引使用的价值
list[index]
根据这个讨论: http : //bytes.com/topic/python/answers/464012-objects-list-index
循环计数器迭代
循环索引的当前习惯使用内置的“范围”function:
for i in range(len(sequence)): # work with index i
循环遍历元素和索引可以通过旧的习惯用法或使用新的“zip”内置函数来实现[2]:
for i in range(len(sequence)): e = sequence[i] # work with index i and element e
要么
for i, e in zip(range(len(sequence)), sequence): # work with index i and element e
在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个项目。 对于大小超过10000的项目, enumerate
是胜利者。
下面添加一些有用的链接:
-
Python 2.X中的range和xrange函数有什么区别?
-
什么是更快的循环使用枚举或for循环在Python中使用xrange?
-
范围(len(list))还是枚举(list)?
你可以用这个代码来做到这一点:
ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value
如果您需要在循环结束时重置索引值,请使用此代码:
ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value if index >= len(ints)-1: index = 0
这个问题的最佳解决scheme是使用枚举内部的Python函数。
枚举返回元组
第一个值是索引
第二个值是该索引处的数组的元素
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)