-
同時迭代多個序列
運用內置zip()
函數
zip(a, b) 會生成一個可返回元組 (x, y) 的迭代器,其中 x 來自 a, y 來自 b。一旦其中某個序列到結尾,迭代宣告結束。因此迭代長度跟參數中最短序列長度一致。
例如
>>> headers = ['name', 'shares', 'price','other']
>>> values = ['ACME', 100, 490.1]
>>> for name,value in zip(headers,values):
print(name,"=",value )
name = ACME
shares = 100
price = 490.1
>>>
上述迭代長度僅根參數最短序列長度一致,若需要與最長序列一致,可以使用 itertools.zip_longest()
函數來代替
上述例子可改寫為:
>>> import itertools
>>> for name,value in itertools.zip_longest(headers,values):
print(name,"=",value )
name = ACME
shares = 100
price = 490.1
other = None
>>>
-
序列上索引值迭代
運用內置enumerate()
函數
enumerate() 函數返回的是一個 enumerate 對象實例,它是一個迭代器,返回連續的包含一個計數和一個值的元組,元組中的值通過在傳入序列上調用 next() 返回,可指定一個開始的索引參數
示例1:
>>> values = ['ACME', 100, 490.1]
>>> for idx,val in enumerate(values,1):
print(idx,val)
1 ACME
2 100
3 490.1
>>> for idx,val in enumerate(values):
print(idx,val)
0 ACME
1 100
2 490.1
>>> data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]
>>> for idx,val in enumerate(data):
print(idx,val)
0 (1, 2)
1 (3, 4)
2 (5, 6)
3 (7, 8)
>>>
示例2:統計文本文件單詞出現的行號
# -*- coding: utf-8 -*-
from collections import defaultdict
work_sum=defaultdict(list)
with open("1.txt","r") as fp:
lines=fp.readlines()
for idx,val in enumerate(lines,1):
words=[w.lower() for w in val.split()]
for word in words:
work_sum[word].append(idx)
print(work_sum)
-
跳過可迭代對象的開始部分
僅僅跳過開始部分
使用itertools模塊dropwhile()
函數,使用時,你給它傳遞一個函數對象和一個可迭代對象。它會返回一個迭代器對象,丟棄原有序列中直到函數返回 True 之前的所有元素。然后返回后面所有元素。
#過濾到#開頭的
with open("1.txt","r") as fp:
for line in dropwhile(lambda line :line.startswith('#'), fp):
print(line)
值得注意的是,dropwhile()
函數僅僅是跳過滿足條件的開始行