Accessing the index in 'for' loops?
对于如下列表,如何访问索引本身?
1 | ints = [8, 23, 45, 12, 78] |
当我使用
使用一个额外的可变状态,这样一个可变指数(这一点,你将在这样一个languages normally使用C或php),也被视为非pythonic。 P / < >
更好的选项是使用"建在
1 2 | for idx, val in enumerate(ints): print(idx, val) |
看看PEP 279更多。 P / < >
Using a for loop, how do I access the loop index, from 1 to 5 in this case?
使用
1 2 | for index, item in enumerate(items): print(index, item) |
和音符,Python的indexes开始在零,所以你会得到0到4与以上。如果你想算,1至5,这样做: P / < >
1 2 | for count, item in enumerate(items, start=1): print(count, item) |
unidiomatic流量控制
什么是你的要求,为的pythonic konizit之以下,这就是"现在"的算法programmers较低层次的languages会使用: P / < >
1
2
3
4 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
或在languages,做的不是我在对每一个环: P / < >
1
2
3
4 index = 0
while index < len(items):
print(index, items[index])
index += 1
或有时更多的commonly(但unidiomatically)发现在Python的: P / < >
1
2 for index in range(len(items)):
print(index, items[index])
使用"enumerate功能
Python的
1 2 | for index, item in enumerate(items, start=0): # default is zero print(index, item) |
这个代码的样本是公平的好的例子中,都canonical之间的代码,idiomatic的Python代码,和女人。idiomatic代码也sophisticated(但不是一个复杂的Python)的,在笔试的方式,它被用于去用。idiomatic代码也expected由designers英语语言,这意味着,usually这个代码也不只是readable更多,但也更高效。 P / < > 得到的计数
即使如果你不需要indexes当你走了,但你需要的count"的iterations(有时desirable),你就可以开始与
1 2 3 4 | for count, item in enumerate(items, start=1): # default is zero print(item) print('there were {0} items printed'.format(count)) |
"count似乎更多的是什么,你问到intend(AS opposed到指数),当你说你会不会从1到5。 P / < > 打破它下来在一步一步的解释
要打破这些examples下来,说我们有一个列表的项目,我们想iterate结束与一个指数: P / < >
1 | items = ['a', 'b', 'c', 'd', 'e'] |
现在我们通过这iterable到enumerate,creating an enumerate对象: P / < >
1 | enumerate_object = enumerate(items) # the enumerate object |
我们可以拉出来的,这个项目的第一iterable,我们会得到在环与
1 2 | iteration = next(enumerate_object) # first iteration from enumerate print(iteration) |
我们看到的和我们得到的tuple of
1 | (0, 'a') |
我们可以用什么可以称为"序列unpacking提取物"到"元素从这两个tuple: P / < >
1 2 | index, item = iteration # 0, 'a' = (0, 'a') # essentially this. |
当我们inspect
1 2 3 4 | >>> print(index) 0 >>> print(item) a |
结论
- Python的indexes开始在零
- 得到这些indexes从一个iterable你iterate过来的,使用的enumerate功能
- 用enumerate在idiomatic方式(沿与tuple unpacking)creates code,更多的readable和maintainable:
所以这样做: P / < >
1 2 | for index, item in enumerate(items, start=0): # Python indexes start at zero print(index, item) |
这是很简单的开始它从
1 2 | for index, item in enumerate(iterable, start=1): print index, item |
音符
重要的提示,虽然小misleading由于
1 2 | for i in range(len(ints)): print i, ints[i] |
正如Python中的标准一样,有几种方法可以做到这一点。在所有例子中,假设:
1 2 | for index, element in enumerate(lst): # do the things that need doing here |
在我看来,这也是最安全的选择,因为进入无限递归的机会已经被消除了。项及其索引都保存在变量中,不需要再编写任何代码。访问项目。
2。创建保存索引的变量(使用1 2 | for index in range(len(lst)): # or xrange # you will have to write extra code to get the element |
三。创建保存索引的变量(使用
1 2 3 4 | index = 0 while index < len(lst): # you will have to write extra code to get the element index += 1 # escape infinite recursion |
4。总有别的办法
如前所述,还有其他方法可以做到这一点,这里没有解释,它们甚至可能在其他情况下更适用。例如,使用
老式的方式: P / < >
1 2 | for ix in range(len(ints)): print ints[ix] |
comprehension列表: P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [ (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
1 2 3 | int_list = [8, 23, 45, 12, 78] for index, value in enumerate(int_list): print(index, value) |
输出: P / < >
1 2 3 4 5 | 0 8 1 23 2 45 3 12 4 78 |
在python 2.7中,在循环中访问列表索引的最快方法是对小列表使用range方法,对大中型列表使用enumerate方法。
请在下面的代码示例中查看可用于遍历列表和访问索引值及其性能指标(我认为这对您很有用)的不同方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
请参见下面每个方法的性能指标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 |
因此,使用
在下面添加一些有用的链接:
在python 2.x中,range和x range函数有什么区别?
在python中,使用enumerate的循环或使用xrange的循环更快些?
范围(len(list))还是枚举(list)?
1 2 3 4 | 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) |
这样就可以扩展列表。扩展意味着您可以一次添加多个值。
要附加此列表,您必须编写下面给出的代码:
1 2 3 4 | ints = [9, 23, 45, 12, 78] ints.append([1]) for idx, val in enumerate(ints): print(idx,val) |
这样,您可以一次添加一个值。如果编写
首先,索引将从0到4。编程语言从0开始计数;不要忘记这一点,否则会遇到索引越界异常。for循环中只需要一个从0到4的变量,如下所示:
1 | for x in range(0, 5): |
请记住,我写的是0到5,因为循环会在最大值之前停止一个数字:()
要获取索引值,请使用
1 | list[index] |
您可以使用此代码执行此操作:
1 2 3 4 5 6 | ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value |
如果需要在循环结束时重置索引值,请使用此代码:
1 2 3 4 5 6 7 8 | ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value if index >= len(ints)-1: index = 0 |
根据这discussion:/ / / / / bytes.com topic Python的回答/ 464012 -物体的列表中指数 P / < >
反iteration环 P / < >
"当前idiom为looping结束的indices使用英语,建在"范围"功能: P / < >
1 2 | for i in range(len(sequence)): # work with index i |
looping在两种元素和indices可以,无论是由旧的idiom或通过使用纽约"拉链"建在功能(2): P / < >
1 2 3 | for i in range(len(sequence)): e = sequence[i] # work with index i and element e |
或 P / < >
1 2 | for i, e in zip(range(len(sequence)), sequence): # work with index i and element e |
通过HTTP:/ / / / / www.python.org开发peps PEP / 0212 P / < >
这个问题的最佳解决方案是在build python函数中使用enumerate。枚举返回元组第一个值是索引第二个值是该索引处数组的元素
1 2 3 4 5 6 7 8 9 10 | 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 2 3 | for i in ints: indx = ints.index(i) print(i,indx) |
否则使用
1 2 | for counter, value in enumerate(ints): print(counter, value) |
或以下使用:
1 2 | for counter in range(len(ints)): print(counter, ints[counter]) |
以下是访问
for i in enumerate(items): print(i)
for i, val in enumerate(items): print(i, val)
for i, val in enumerate(items): print(i)
希望这有帮助。
您也可以尝试以下操作:
1 2 3 4 5 6 7 | 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) |
输出是
1 2 3 4 | 0 ['itemA', 'ABC'] 1 ['itemB', 'defg'] 2 ['itemC', 'drug'] 3 ['itemD', 'ashok'] |
如果我要迭代nums=[1,2,3,4,5]我愿意
1 2 | for i, num in enumerate(nums, start = 1): print(i, num) |
或者将长度取为l=len(nums)
1 2 | for i in range(1, l + 1): print(i, nums[i]) |
在您的问题中,您会写"在本例中,如何访问从1到5的循环索引?"
但是,列表的索引从零开始运行。所以,我们需要知道您真正想要的是列表中每个项目的索引和项目,还是您真正想要从1开始的数字。幸运的是,在Python中,这两者都很容易做到。
首先,为了澄清,枚举函数迭代地返回列表中每个项的索引和对应项。
1 2 3 4 | alist = [ 1, 2, 3, 4, 5 ] for n,a in enumerate(alist): print("%d %d"%(n,a) ) |
上述输出为,
1 2 3 4 5 | 0 1 1 2 2 3 3 4 4 5 |
请注意,索引从0开始运行。这种索引在现代编程语言(包括python和c)中很常见。
如果希望循环跨越列表的一部分,可以对列表的一部分使用标准的python语法。例如,要从列表中的第二个项循环到但不包括最后一个项,可以使用
1 2 | for n,a in enumerate(alist[1:-1]): print("%d %d"%(n,a) ) |
请注意,输出索引再次从0开始运行,
1 2 3 | 0 2 1 3 2 4 |
这使我们进入了开始=n开关枚举()。这只需偏移索引,就可以在循环中简单地向索引添加一个数字。
1 2 | for n,a in enumerate(alist,start=1): print("%d %d"%(n,a) ) |
其输出为
1 2 3 4 5 | 1 1 2 2 3 3 4 4 5 5 |
您可以使用
1 2 | ints = [8, 23, 45, 12, 78] inds = [ints.index(i) for i in ints] |
编辑在注释中强调,如果
1 2 | ints = [8, 8, 8, 23, 45, 12, 78] inds = [tup[0] for tup in enumerate(ints)] |
或者
1 2 | ints = [8, 8, 8, 23, 45, 12, 78] inds = [tup for tup in enumerate(ints)] |
如果您想同时获得
它在这个问题的选定答案中使用了
使用
1 2 | ints = [8, 23, 45, 12, 78] print [(i,ints[i]) for i in range(len(ints))] |
输出:
1 | [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)] |
也可以使用
1 2 | for i in ints: print(ints.index(i), i) |
在这里,索引从0开始。但如果您需要从1开始,只需将1添加到
1 2 | for i in int: print(int.index(i) + 1, i) |
您已经收到了许多解释
例如,如果使用索引为列表中的数字提取相应的名称,可以这样做:
1 2 3 4 | ints = [8, 23, 45, 12, 78] names = ["John","Sue","Johannes","Patel","Ian"] for int, name = zip(ints, names): print("{} - {}".format(name, int) |
会产生
1 2 3 4 5 | 8 - John 23 - Sue 45 - Johannes 12 - Patel 78 - Ian |
这充分发挥了作用:
1 2 3 | list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3] for x in list1: print('index:', list1.index(x), 'value:', x) |