首頁 > 軟體

Python中itertools庫的四個函數介紹

2022-04-06 13:00:02

1. 引言

在Python開發中,​​itertools​​庫經常被忽視,實際上該庫中抱恨了一些非常棒的函數,特別是用於處於資料流的函數。在本文中,我們將討論該庫中的十分使用的幾個函數,並重點介紹什麼時候我們應該考慮使用它們。
閒話少說,我們直接開始吧!

2. accumulate() 函數

第三方庫​​itertools​​提供的函數​​accumulate()​​,可以幫助我們對資料流執行累積操作。換句話說,假設我們有一個資料列表[a,b,c,d,e]和一個運算f,那麼函數​​accumulate()​​可以幫助我們計算​​f(a,b)​​,​​f(f(a,b),c)​​,​​f(f(f(a,b),c),d)​​,等等。
文字有點不直觀,那我們來舉個累加的栗子吧!

樣例程式碼如下:

import itertools
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]

res = itertools.accumulate(data, lambda x,y:x+y)
print(list(res))
# [3, 7, 13, 15, 16, 25, 25, 32, 37, 45]

上述函數​​accumulate()​​的作用是:先把3和4相加,然後得到7,再和6相加,得到另一個值,依此類推。

需要注意的是:如果要執行給定3個或更多值的累計操作,則不允許使用該函數,因為accumulate()只接受迭代器,迭代器每次呼叫next()返回至多1個元素。

3. compress() 函數

函數​​compress()​​可以根據我們的喜好來過濾內容。與函數​​filter()​​函數不同,函數​​compress()​​需要傳入相應的標誌位來決定是否應該保留每個值。

舉個例子會更加直觀,相關樣例程式碼如下:

import itertools
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
selector = [1, 0, 0, 0, 1, 1, 0, 1, 1, 0]
res = itertools.compress(data, selector)
print(list(res))
# [3, 1, 9, 7, 5]

在上面的範例中,如果資料是奇數,則選擇器將為 1,否則為 0。因此,函數​​compress()​​ 操作的結果將只是保留原始資料中的奇數。

4. groupby() 函數

在許多情況下,我們會在 Python 中以隨機順序獲得一個元組列表,假如我們希望按值對它們進行分組。此時是函數​​ groupby()​​ 發揮作用的完美場景!

函數​​ groupby()​​ 將接受一個可迭代的引數和一個返回值的函數,然後它將按函數返回的值對元組列表進行分組。

例如,我們想按國家對以下城市進行分組:

import itertools

data = [('New York', 'US'), ("Shanghai", "China"),
("LA", 'US'),("Chongqing", "China")]

for city, group in itertools.groupby(sorted(data, key=lambda x: x[1]), lambda x: x[1]):
for i in group:
print("%s is in %s." % (i[0], city))
print("")

# Shanghai is in China.
# Chongqing is in China.

# New York is in US.
# LA is in US.

5. 排列組合操作

排列組合可能是 ​​itertools​​庫中最令人驚歎的函數之一,它提供了排列組合運運算元!
我們唯一需要做的就是將正確的關鍵字與輸出元組的長度一起傳遞給相應的函數,

如下例所示:

import itertools
data = [3, 4, 6]

com_res = itertools.combinations(data, 2)
print(list(com_res))
# [(3, 4), (3, 6), (4, 6)]

com_res = itertools.permutations(data, 2)
print(list(com_res))
# [(3, 4), (3, 6), (4, 3), (4, 6), (6, 3), (6, 4)]

com_without_replacement_res = itertools.combinations_with_replacement(data, 2)
print(list(com_without_replacement_res))
# [(3, 3), (3, 4), (3, 6), (4, 4), (4, 6), (6, 6)]

product_res = itertools.product(data, data)
print(list(product_res))
# [(3, 3), (3, 4), (3, 6), (4, 3), (4, 4), (4, 6), (6, 3), (6, 4), (6, 6)]

6 總結

庫​​itertools​​對大多數人來說,是一個未被充分利用甚至很少聽到的庫,但它確實包含一些非常好用的函數。這些函數通常可以幫助我們將程式碼行數減少到僅一行,使我們的程式碼看起來更加簡潔優雅!

到此這篇關於Python中itertools庫的四個函數介紹的文章就介紹到這了,更多相關Python中itertools庫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com