对教程中的enumerate()函数感到困惑

时间:2013-11-01 09:06:18

标签: python function

实际上我正在学习一些以前写过的脚本的python,我尝试逐行理解代码但是在这段代码中我不知道到底发生了什么(特别是在第2行):

def convertSeq(s, index):
    result = [i + 1 for i, ch in enumerate(s) if ch == '1']
    result = ' '.join([str(index) + ':' + str(i) for i in result])
    result = str(index) + ' ' + result
    return result

谢谢

4 个答案:

答案 0 :(得分:1)

enumerate返回一个迭代器(enumerate object),它产生tuples包含传递给它的iterable / itertator中的索引和项。

>>> text = 'qwerty'
>>> it = enumerate(text)
>>> next(it)
(0, 'q')
>>> next(it)
(1, 'w')
>>> next(it)
(2, 'e')
>>> list(enumerate(text))
[(0, 'q'), (1, 'w'), (2, 'e'), (3, 'r'), (4, 't'), (5, 'y')]

因此,代码中的列表理解实际上等同于:

>>> text = '12121'
>>> result = []
for item in enumerate(text):
    i, ch = item              #sequence unpacking
    if ch == '1':
        result.append(i+1)
...         
>>> result
[1, 3, 5]

实际上你也可以将索引的起点传递给枚举,这样你的列表补偿就可以改为:

result = [i for i, ch in enumerate(s, start=1) if ch == '1']

enumerate通常比这样的东西更受欢迎:

>>> lis = [4, 5, 6, 7]
for i in xrange(len(lis)):
    print i,'-->',lis[i]
...     
0 --> 4
1 --> 5
2 --> 6
3 --> 7

更好:

>>> for ind, item in enumerate(lis):
    print ind,'-->', item
...     
0 --> 4
1 --> 5
2 --> 6
3 --> 7

enumerate也适用于迭代器:

>>> it = iter(range(5, 9))      #Indexing not possible here
for ind, item in enumerate(it):
    print ind,'-->', item
...     
0 --> 5
1 --> 6
2 --> 7
3 --> 8

enumerate的帮助:

class enumerate(object)
 |  enumerate(iterable[, start]) -> iterator for index, value of iterable
 |  
 |  Return an enumerate object.  iterable must be another object that supports
 |  iteration.  The enumerate object yields pairs containing a count (from
 |  start, which defaults to zero) and a value yielded by the iterable argument.
 |  enumerate is useful for obtaining an indexed list:
 |      (0, seq[0]), (1, seq[1]), (2, seq[2]), ...

答案 1 :(得分:0)

枚举遍历迭代器,并返回一个包含当前索引和当前项的元组。

>>> for i in range(100,105):
...     print(i)
... 
100
101
102
103
104
>>> for info in enumerate(range(100,105)):
...     print(info)
... 
(0, 100)
(1, 101)
(2, 102)
(3, 103)
(4, 104)

答案 2 :(得分:0)

它从任何可迭代对象创建一个新的迭代器,它返回原始对象中的值以及从0开始的索引。例如

lst = ["spam", "eggs", "tomatoes"]

for item in lst:
  print item

# spam
# eggs
# tomatoes

for i, item in enumerate(lst):
   print i, item

# 0 spam
# 1 eggs
# 2 tomatoes

答案 3 :(得分:0)

enumarate是一个python内置函数,可以帮助您跟踪序列的索引。

请参阅以下代码:

    >>>sequence = ['foo', 'bar', 'baz']
    >>>
    >>>list(enumerate(sequence)) # prints [(0, 'foo'), (1, 'bar'), (2, 'baz')]
    >>>
    >>>zip(range(len(sequence)), sequence) # prints [(0, 'foo'), (1, 'bar'), (2, 'baz')]
    >>>for item in sequence:
    ......print (item, sequence.index(item))
    ('foo', 0)
    ('bar', 1)
    ('baz', 2)

正如您所看到的,结果是相同的,但是枚举它更容易编写,读取并且在某些情况下更有效。