实际上我正在学习一些以前写过的脚本的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
谢谢
答案 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)
正如您所看到的,结果是相同的,但是枚举它更容易编写,读取并且在某些情况下更有效。