[ (ix, ints[ix]) for ix in range(len(ints))]
>>> ints[1, 2, 3, 4, 5]>>> for ix in range(len(ints)): print ints[ix]...12345>>> [ (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)>>>
count = 0 # in case items is emptyfor count, item in enumerate(items, start=1): # default is zeroprint(item)
print('there were {0} items printed'.format(count))
当您说您想要从1到5时,计数似乎更符合您的要求(而不是索引)。
打破它-一步一步的解释
为了分解这些例子,假设我们有一个要使用索引迭代的项目列表:
items = ['a', 'b', 'c', 'd', 'e']
现在我们将这个可迭代对象传递给enumerate,创建一个enumerate对象:
enumerate_object = enumerate(items) # the enumerate object
我们可以从这个可迭代对象中提取第一个项目,我们将使用next函数进行循环:
iteration = next(enumerate_object) # first iteration from enumerateprint(iteration)
# Using rangedef range_loop(iterable):for i in range(len(iterable)):1 + iterable[i]
# Using enumeratedef enumerate_loop(iterable):for i, val in enumerate(iterable):1 + val
# Manual indexingdef manual_indexing_loop(iterable):index = 0for item in iterable:1 + itemindex += 1
请参阅下面每个方法的性能指标:
from timeit import timeit
def measure(l, number=10000):print("Measure speed for list with %d items" % len(l))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 speed for list with 1000 itemsmeasure(range(1000))# range: 1.161622366# enumerate: 0.5661940879999996# manual_indexing: 0.610455682
# Measure speed for list with 100000 itemsmeasure(range(10000))# range: 11.794482958# enumerate: 6.197628574000001# manual_indexing: 6.935181098000001
# Measure speed for list with 10000000 itemsmeasure(range(10000000), number=100)# range: 121.416859069# enumerate: 62.718909123# manual_indexing: 69.59575057400002
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)
def createGenerator():items = [8, 23, 45, 12, 78]
for (j, k) in enumerate(items):yield (j, k)
generator = createGenerator()
for i in generator:print(i)
结果:
# (0, 8)# (1, 23)# (2, 45)# (3, 12)# (4, 78)
9.使用for-in循环和lambda的内联表达式。
items = [8, 23, 45, 12, 78]
xerox = lambda upperBound: [(i, items[i]) for i in range(0, upperBound)]print(xerox(5))
[index for index, datum in enumerate(data) if 'a' in datum]
解释:
>>> data = ['a','ab','bb','ba','alskdhkjl','hkjferht','lal']>>> data['a', 'ab', 'bb', 'ba', 'alskdhkjl', 'hkjferht', 'lal']>>> [index for index, datum in enumerate(data) if 'a' in datum][0, 1, 3, 4, 6]>>> [index for index, datum in enumerate(data) if 'b' in datum][1, 2, 3]>>>