W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你想在迭代一個(gè)序列的同時(shí)跟蹤正在被處理的元素索引。
內(nèi)置的 enumerate()
函數(shù)可以很好的解決這個(gè)問(wèn)題:
>>> my_list = ['a', 'b', 'c']
>>> for idx, val in enumerate(my_list):
... print(idx, val)
...
0 a
1 b
2 c
為了按傳統(tǒng)行號(hào)輸出(行號(hào)從1開(kāi)始),你可以傳遞一個(gè)開(kāi)始參數(shù):
>>> my_list = ['a', 'b', 'c']
>>> for idx, val in enumerate(my_list, 1):
... print(idx, val)
...
1 a
2 b
3 c
這種情況在你遍歷文件時(shí)想在錯(cuò)誤消息中使用行號(hào)定位時(shí)候非常有用:
def parse_data(filename):
with open(filename, 'rt') as f:
for lineno, line in enumerate(f, 1):
fields = line.split()
try:
count = int(fields[1])
...
except ValueError as e:
print('Line {}: Parse error: {}'.format(lineno, e))
enumerate()
對(duì)于跟蹤某些值在列表中出現(xiàn)的位置是很有用的。所以,如果你想將一個(gè)文件中出現(xiàn)的單詞映射到它出現(xiàn)的行號(hào)上去,可以很容易的利用 enumerate()
來(lái)完成:
word_summary = defaultdict(list)
with open('myfile.txt', 'r') as f:
lines = f.readlines()
for idx, line in enumerate(lines):
# Create a list of words in current line
words = [w.strip().lower() for w in line.split()]
for word in words:
word_summary[word].append(idx)
如果你處理完文件后打印 word_summary
,會(huì)發(fā)現(xiàn)它是一個(gè)字典(準(zhǔn)確來(lái)講是一個(gè) defaultdict
),對(duì)于每個(gè)單詞有一個(gè) key
,每個(gè) key
對(duì)應(yīng)的值是一個(gè)由這個(gè)單詞出現(xiàn)的行號(hào)組成的列表。如果某個(gè)單詞在一行中出現(xiàn)過(guò)兩次,那么這個(gè)行號(hào)也會(huì)出現(xiàn)兩次,同時(shí)也可以作為文本的一個(gè)簡(jiǎn)單統(tǒng)計(jì)。
當(dāng)你想額外定義一個(gè)計(jì)數(shù)變量的時(shí)候,使用 enumerate()
函數(shù)會(huì)更加簡(jiǎn)單。你可能會(huì)像下面這樣寫(xiě)代碼:
lineno = 1
for line in f:
# Process line
...
lineno += 1
但是如果使用 enumerate()
函數(shù)來(lái)代替就顯得更加優(yōu)雅了:
for lineno, line in enumerate(f):
# Process line
...
enumerate()
函數(shù)返回的是一個(gè) enumerate
對(duì)象實(shí)例,它是一個(gè)迭代器,返回連續(xù)的包含一個(gè)計(jì)數(shù)和一個(gè)值的元組,元組中的值通過(guò)在傳入序列上調(diào)用 next()
返回。
還有一點(diǎn)可能并不很重要,但是也值得注意,有時(shí)候當(dāng)你在一個(gè)已經(jīng)解壓后的元組序列上使用 enumerate()
函數(shù)時(shí)很容易調(diào)入陷阱。你得像下面正確的方式這樣寫(xiě):
data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]
# Correct!
for n, (x, y) in enumerate(data):
...
# Error!
for n, x, y in enumerate(data):
...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: