【2017-09-26】迭代器與生成器(三)

  • 同時迭代多個序列
    運用內置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() 函數僅僅是跳過滿足條件的開始行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容