python 跳過可迭代物件的開始部分

2022-03-15 15:37:04 字數 1693 閱讀 6561

想遍歷乙個可迭代物件,但是它開始的某些元素你並不感興趣,想跳過它們

itertools 模組中有一些函式可以完成這個任務。首先介紹的是itertools.dropwhile() 函式。使用時,你給它傳遞乙個函式物件和乙個可迭代物件。它會返回乙個迭代器物件,丟棄原有序列中直到函式返回true 之前的所有元素,然後返回後面所有元素。為了演示,假定你在讀取乙個開始部分是幾行注釋的原始檔。

with open('/etc/passwd') as f:

... for line in f:

... print(line, end='')

如果你想跳過開始部分的注釋行的話,可以這樣做:

from itertools import dropwhile

>>> with open('/etc/passwd') as f:

... for line in dropwhile(lambda line: line.startswith('#'), f):

... print(line, end='')

這個例子是基於根據某個測試函式跳過開始的元素。如果你已經明確知道了要跳過的元素的個數的話,那麼可以使用itertools.islice() 來代替。比如:

from itertools import islice

>>> items = ['a', 'b', 'c', 1, 4, 10, 15]

>>> for x in islice(items, 3, none):

... print(x)

...14

1015

>>>

在這個例子中, islice() 函式最後那個none 引數指定了你要獲取從第3 個到最後的所有元素,如果none 和3 的位置對調,意思就是僅僅獲取前三個元素恰恰相反,(這個跟切片的相反操作[3:] 和[:3] 原理是一樣的)。

函式dropwhile() 和islice() 其實就是兩個幫助函式,為的就是避免寫出下面這種冗餘**:

with open('/etc/passwd') as f:

# skip over initial comments

while true:

line = next(f, '')

if not line.startswith('#'):

break

# process remaining lines

while line:

# replace with useful processing

print(line, end='')

line = next(f, none)

跳過乙個可迭代物件的開始部分跟通常的過濾是不同的。比如,上述**的第乙個部分可能會這樣重寫:

with open('/etc/passwd') as f:

lines = (line for line in f if not line.startswith('#'))

for line in lines:

print(line, end='')

這樣寫確實可以跳過開始部分的注釋行,但是同樣也會跳過檔案中其他所有的注釋行。換句話講,我們的解決方案是僅僅跳過開始部分滿足測試條件的行,在那以後,所有的元素不再進行測試和過濾了。最後需要著重強調的一點是,本節的方案適用於所有可迭代物件,包括那些事先不能確定大小的,比如生成器,檔案及其類似的物件。

Python 可迭代物件

1.可迭代物件 以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield 的 generator function 這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 2...

python可迭代物件

0 在python中只要是能用for in的,都是可迭代物件,讓我們看下定義 定義 我們已經知道可以對list tuple dict set str等型別的資料使用for in 的迴圈語法,會從其中依次拿到資料元素進行使用,我們把這樣的過程稱為遍歷,也叫迭代。所以我們把可以通過for in 這類語句...

PYTHON 迭代器 可迭代物件

通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...