itertools:迭代器函數

文章目錄

  • 一、合并和分解迭代器
    • 1、chain:首尾相接
    • 2、zip / zip_longest:對齊取數
    • 3、islice:切片
    • 4、tee:分裂
  • 二、轉換輸入
    • 1、map / starmap:函數映射
  • 三、生成新值
    • 1、count:生成連續整數
    • 2、repeat:單個值的重復
    • 3、cycle:某段內容的循環重復
  • 四、過濾
    • 1、takewhile:獲取元素直至 False
    • 2、dropwhile:跳過元素直至 False
    • 3、filter / filterfalse:篩選每個元素
    • 4、compress:迭代器控制元素輸出
  • 五、數據分組
    • 1、groupby:對連續相同元素分組
  • 六、合并輸入
    • 1、accumulate:元素累加
    • 2、product:笛卡爾積
    • 3、permutations:元素有序排列,M個元素中選N個
    • 4、combinations:元素無序組合,M個元素中選N個
    • 5、combinations_with_replacement:考慮自身元素的無序組合

itertools模塊包括一組用于處理序列數據集的函數。該模塊的目的是能夠快速處理數據、高效使用內存,以及表述更加復雜的迭代算法。

import itertools

一、合并和分解迭代器

1、chain:首尾相接

chain可以把多個源迭代器從頭到尾連接成一個迭代器:

it = itertools.chain(iter([1, 2, 3]), ['a', 'b', 'c'])
>>> list(it): [1, 2, 3, 'a', 'b', 'c']

chain.from_iterable()方法適用于無法提前知道源迭代器數據,或者需要采用懶方式計算的情況。注意,該方法只能傳入一個參數

def make_iterables_to_chain():yield [1, 2, 3]yield ['a', 'b', 'c']it = itertools.chain.from_iterable(make_iterables_to_chain())
>>> list(it): [1, 2, 3, 'a', 'b', 'c']

2、zip / zip_longest:對齊取數

Python 內置的zip函數可以把多個源迭代器封裝成惰性生成器(lazy generator),每次推進時會從這些源迭代器中分別獲取下一個元素值,形成元組返回:

it = zip([1, 2, 3], ['a', 'b', 'c'])
>>> list(it): [(1, 'a'), (2, 'b'), (3, 'c')]

任何一個源迭代器耗盡,zip就會停止,也就是說,zip惰性生成器的可迭代次數,取決于最短源迭代器的可迭代次數。

itertools模塊中的zip_longest函數會將所有的源迭代器耗盡,即使它們的可迭代次數不同。默認會把源迭代器缺少的值替換為None,可以借助參數fillvalue來指定缺失值的替換值:

it = itertools.zip_longest([1, 2, 3, 4], ['a', 'b', 'c'], fillvalue='missing_value')
>>> list(it): [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'missing_value')]

3、islice:切片

islice在不拷貝數據的前提下,按照下標切割源迭代器。與列表相同,islice同樣包括開始位置start、結束位置end和步長step,其中startstep是可選的。

# 僅配置結束位置
it = itertools.islice([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5)
>>> list(it): [0, 1, 2, 3, 4]# 配置開始位置、結束位置和步長
it = itertools.islice(range(100), 5, 15, 2)
>>> list(it): [5, 7, 9, 11, 13]

4、tee:分裂

tee函數可以將源迭代器分裂成多個獨立的迭代器,分裂個數由第二個參數指定(默認為2)。如果分裂出的迭代器推進速度不一致,程序可能要用大量內存做緩沖,以存放進度落后的迭代器將來會用到的元素。

ori_it = [1, 2, 3, 4, 5]
it1, it2, it3 = itertools.tee(ori_it, 3)
>>> list(it1/it2/it3): [1, 2, 3, 4, 5]

即使用tee函數創建出了新迭代器,如果源迭代器被推進,新迭代器將不會再產出被推進的值。所以創建了新迭代器后,不建議再使用源迭代器

ori_it = iter([1, 2, 3, 4, 5])
it1, it2, it3 = itertools.tee(ori_it, 3)
next(ori_it), next(ori_it)
>>> list(it1/it2/it3): [3, 4, 5]

二、轉換輸入

1、map / starmap:函數映射

Python 內置的map函數能夠將源迭代器中的值作為參數,調用映射函數并返回一個迭代器。任何一個源迭代器被耗盡時,map函數都會停止。

list1 = [1, 2, 3, 4, 5]
list2 = [0, 2, 4]result1 = map(lambda x: x**2, list1)
>>> list(result1): [1, 4, 9, 16, 25]def map_multiple(x, y):return x*y
result2 = map(map_multiple, list1, list2)
>>> list(result2): [0, 4, 12]

itertools模塊中的starmap函數與map函數類似,但是它是使用*(unpacking)語法分解單個源迭代器中的元素作為映射函數的參數:

values = [(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
it = itertools.starmap(lambda x, y: x*y, values)
>>> list(result1): [0, 6, 14, 24, 36]

可以通俗認為,傳入map函數的映射函數名為f(it1, it2),而傳入starmap函數的映射函數名為f(*it)

三、生成新值

1、count:生成連續整數

count函數能夠無限地生成連續的整數,首個生成的整數可以通過第一個參數指定(默認為0)。count函數可以指定「開始位置」和「步長」參數,但是沒有「結束位置」參數。

it = zip(itertools.count(), ['a', 'b', 'c'])
>>> list(it): [(0, 'a'), (1, 'b'), (2, 'c')]# -1 為起始整數,3 為步長
it = zip(itertools.count(-1, 3), ['a', 'b', 'c'])
>>> list(it): [(-1, 'a'), (2, 'b'), (5, 'c')]

2、repeat:單個值的重復

repeat函數可以不停地輸出某個值,允許配置第二個參數times來限制輸出次數:

it = itertools.repeat('hello', 5)
>>> list(it): ['hello', 'hello', 'hello', 'hello', 'hello']

3、cycle:某段內容的循環重復

cycle函數可以循環地重復輸出源迭代器中的各項元素。由于必須記住源迭代器的全部內容,所以如果源迭代器很長,可能會耗費大量內存。

it = zip(range(7), itertools.cycle(['a', 'b', 'c']))
>>> list(it): [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'a'), (4, 'b'), (5, 'c'), (6, 'a')]

四、過濾

1、takewhile:獲取元素直至 False

takewhile函數會一直從源迭代器中獲取元素,直至判斷函數返回False,停止輸出該元素,也不會再判斷后續元素:

it = itertools.takewhile(lambda x: x < 2, [-1, 0, 1, 2, -2])
>>> list(it): [-1, 0, 1]

2、dropwhile:跳過元素直至 False

takewhile函數相反,dropwhile函數會一直跳過源迭代器中的元素,直至判斷函數返回False,開始輸出該元素及后續元素(后續不再判斷):

it = itertools.dropwhile(lambda x: x < 2, [-1, 0, 1, 2, -2])
>>> list(it): [2, -2]

3、filter / filterfalse:篩選每個元素

Python 內置的filter函數能夠從源迭代器中篩選出判斷函數返回True的元素,并返回一個迭代器。filter函數會測試每一個元素

it = filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5])
>>> list(it): [2, 4]

itertools模塊中的filterfalse函數恰好與filter函數相反,從源迭代器中篩選出判斷函數返回False的元素。同樣,filterfalse函數會測試每一個元素

it = itertools.filterfalse(lambda x: x%2 == 0, [1, 2, 3, 4, 5])
>>> list(it): [1, 3, 5]

4、compress:迭代器控制元素輸出

compress函數使用第二個源迭代器的布爾元素來判斷,對第一個源迭代器的元素是輸出還是跳過。兩個迭代器中的任何一個被耗盡,都會停止輸出

it = itertools.compress(range(1, 10), [True, False, False, True, False])
>>> list(it): [1, 4]

五、數據分組

1、groupby:對連續相同元素分組

groupby函數用于對源迭代器中連續相同的元素進行分組,生成的迭代器每次生成一個(key, group)對,key是分組的鍵值,group是一個子迭代器,包含當前組的所有元素。

for key, group in itertools.groupby('AAAABBBCCD'):print(key, list(group))
>>> 輸出結果:A ['A', 'A', 'A', 'A']B ['B', 'B', 'B']C ['C', 'C']D ['D']for key, group in itertools.groupby([('a', 1), ('a', 2), ('b', 3), ('b', 4), ('c', 5)], lambda x: x[0]):print(key, list(group))
>>> 輸出結果:a [('a', 1), ('a', 2)]b [('b', 3), ('b', 4)]c [('c', 5)]

請注意,如果相同的元素不連續,會被分到不同的組。因此,如果要將所有相同的元素分組而不管是否連續,通常需要先對數據進行排序

for key, group in itertools.groupby([1, 2, 2, 3, 4, 4, 4, 1, 1, 3]):print(key, list(group))
>>> 輸出結果:1 [1]2 [2, 2]3 [3]4 [4, 4, 4]1 [1, 1]3 [3]

六、合并輸入

1、accumulate:元素累加

accumulate函數會對源迭代器中的元素進行累加,每次累加都會生成一個元素。可以指定表示累加邏輯的函數,該函數可以是任何的雙參數函數,默認邏輯是兩值相加。

it1 = itertools.accumulate(range(5))
>>> list(it1): [0, 1, 3, 6, 10]it2 = itertools.accumulate('abcde')
>>> list(it2): ['a', 'ab', 'abc', 'abcd', 'abcde']it = itertools.accumulate('abcde', lambda x, y: y + x + y)
>>> list(it): ['a', 'bab', 'cbabc', 'dcbabcd', 'edcbabcde']

accumulate函數和functools模塊里的reduce函數類似,但是后者只會給出最終的累計值:

import functools
# result 等于 45
result = functools.reduce(lambda x, y: x + y, range(10))

2、product:笛卡爾積

product函數從一個或者多個源迭代器中獲取元素,并計算笛卡爾積。它可以取代多層嵌套的for循環。要計算源迭代器與自身的積,可以使用參數repeat指定輸入重復多少次。

single = itertools.product([1, 2], repeat=2)
>>> list(single): [(1, 1), (1, 2), (2, 1), (2, 2)]multiple = itertools.product([1, 2], ['a', 'c'])
>>> list(multiple): [(1, 'a'), (1, 'c'), (2, 'a'), (2, 'c')]

3、permutations:元素有序排列,M個元素中選N個

permutations函數將源迭代器中的元素以指定長度進行有序排列,默認(不指定長度)會生成所有排列的全集(長度為源迭代器中元素個數)。使用r參數指定所返回排列的長度。

it1 = itertools.permutations('abc')
>>> list(it1): [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]it2 = itertools.permutations('abc', r=2)
>>> list(it2): [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

4、combinations:元素無序組合,M個元素中選N個

combinations函數將源迭代器中的元素以指定長度進行無序組合。與permutations函數不同的是,該函數的 r 參數是必要參數。只要源迭代器的元素取值是唯一的,輸出就不會包含任何重復的值。

it = itertools.combinations('abca', r=2)
>>> list(it): [('a', 'b'), ('a', 'c'), ('a', 'a'), ('b', 'c'), ('b', 'a'), ('c', 'a')]

5、combinations_with_replacement:考慮自身元素的無序組合

combinations函數不同的是,combinations_with_replacement函數會將當前元素與「當前元素、所有的其他元素」均進行配對:

it = itertools.combinations_with_replacement('abcd', r=2)
>>> list(it): [('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('c', 'c'), ('c', 'd'), ('d', 'd')]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92773.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI論文】序列標注任務廣義化研究(SFT廣義化):基于獎勵修正的強化學習視角

摘要&#xff1a;我們針對大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的監督微調&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一種簡單但具有理論依據的改進方法&#xff0c;以解決其與強化學習&#xff08;Reinforcemen…

(已解決)Mac 終端上配置代理

說明&#xff1a;為了便于理解&#xff0c;本文描述略顯“抽象”與“潦草”&#xff0c;為了過審&#xff0c;僅供學習交流使用。&#x1f680; 簡潔流程版啟動工具 點擊圖標&#xff0c;復制它給出的終端命令將這段內容粘貼進你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章寫太多&#xff0c;都不記得之前寫的有什么了&#xff0c;但習慣了在這里記錄&#xff0c;先寫上吧。關于multi-scale representation又是看著忘著&#xff0c;還是寫下點什么比較啊。時看時新&#xff0c;還是想吐槽自己看論文太不認真了。下面直接按照文章順序…

板塊三章節3——NFS 服務器

NFS 服務器 NFS 服務介紹 NFS 是Network File System的縮寫&#xff0c;即網絡文件系統&#xff0c;最早由Sun公司開發&#xff0c;**用來在UNIX&Linux系統間實現磁盤文件共享的一種方法。**它的主要功能是通過網絡讓不同的主機系統之間可以共享文件或目錄。NFS客戶端&…

數學建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一種優化方法&#xff0c;旨在最大化最壞情況下的收益或最小化最壞情況下的損失。常見的現實問題有&#xff1a;求最大值的最小化問題最大風險的最低限度最小化最壞情況下的損失等2.一般數學模型 (找最大值里面最小…

【JAVA】使用系統音頻設置播放音頻

代碼直接可以運行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 強制使用的通用音頻格式private st…

[CSP-J 2021] 小熊的果籃

題目 12代碼 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一個水果塊(對于水果就是上個水果)l,//塊開始的序號&#xff0c;左邊界 d,//塊類型&#xff0c;0/1id,//水果序號 r,//塊結束的序號&#xff0c;右邊界 next;//下一塊…

【C++】STL二叉搜索樹——map與set容器的基礎結構

目錄 前言 1.二叉搜索樹的概念 1.1基本結構 1.2性能分析 2.二叉搜索樹的實現 2.1創建 2.2插入 2.3查找與遍歷 2.4刪除 3.二叉搜索樹類代碼 前言 C中STL的map與set容器廣泛應用于實踐過程中&#xff0c;本文將詳細分析容器最基礎的二叉搜索樹結構&#xff0c;為后續map…

基于Spring Boot和SSE的實時消息推送系統

一、SSE技術深度解析 1.1 協議工作原理 #mermaid-svg-u7ZBlEsXcn68R5a8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-icon{fill:#552222;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-text{fi…

Day 40 訓練和測試的規范寫法

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練代…

分析代碼并回答問題

代碼 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上掃描192.168.1.0/24子網的所有IP地址

在macOS上掃描192.168.1.0/24子網的所有IP地址&#xff0c;可以通過終端命令實現。以下是幾種常用方法&#xff1a; 使用ping命令循環掃描 打開終端執行以下腳本&#xff0c;會逐個ping測試192.168.1.1到192.168.1.254的地址&#xff0c;并過濾出有響應的IP&#xff1a; for i …

Java基礎05——類型轉換(本文為個人學習筆記,內容整理自嗶哩嗶哩UP主【遇見狂神說】的公開課程。 > 所有知識點歸屬原作者,僅作非商業用途分享)

Java基礎05——類型轉換 類型轉換 由于Java是強類型語言&#xff0c;所以要進行有些運算的時候&#xff0c;需要用到類型轉換。 如&#xff1a;byte(占1個字節)&#xff0c;short(占2個字節)&#xff0c;char(占2個字節)→int(4個字節)→long(占8個字節)→float(占4個字節)→do…

mysql基礎(二)五分鐘掌握全量與增量備份

全量備份 Linux環境 數據備份 數據庫的備份與恢復有多中方法&#xff0c;通過mysql自帶的mysqldump工具可對數據庫進行備份。語法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql說明&#xff1a; -u參數指定用戶名&#xff0c;usern…

使用Windbg分析多線程死鎖項目實戰問題分享

目錄 1、問題描述 2、使用.effmach x86命令切換到32位上下文 3、切換到UI線程&#xff0c;發現UI線程死鎖了 4、使用!locks命令查看臨界區鎖的詳細信息&#xff0c;遇到了問題 5、使用dt命令查看臨界區對象信息&#xff0c;找到發生死鎖的多個線程 6、用戶態鎖與內核態鎖…

防火墻組網方式總結

一、部署模式&#xff1a;靈活適配多樣網絡環境下一代防火墻&#xff08;NGAF&#xff09;具備極強的網絡適應能力&#xff0c;支持五種核心部署模式&#xff0c;可根據不同網絡需求靈活選擇。路由模式&#xff1a;防火墻相當于路由器&#xff0c;位于內外網之間負責路由尋址&a…

AI大模型:(二)5.1 文生視頻(Text-to-Video)模型發展史

目錄 1.介紹 2.發展歷史 2.1.早期探索階段(2015-2019) 2.1.1.技術萌芽期 2.1.2.RNN/LSTM時代 2.2.技術突破期(2020-2021) 2.2.1 Transformer引入視頻生成 2.2.2 擴散模型的興起 2.3.商業化突破期(2022-2023) 2.3.1 產品化里程碑 2.3.2 競爭格局形成 2.4.革命…

14mm尋北儀能否塞進液壓支架生死縫隙?

在煤礦井下世界的方寸之間&#xff0c;液壓支架的每個關鍵節點都承載著千鈞重壓。頂梁鉸接點、立柱頂端、掩護梁角落&#xff0c;恰恰是空間最為局促的“禁區”。ER-MNS-10A MEMS尋北儀應運而生&#xff01;它采用了先進的MEMS陀螺技術&#xff0c;以14mm至薄高度、40g極致輕盈…

python之淺拷貝深拷貝

文章目錄潛拷貝(shallow copy)深拷貝(deep copy)總結一下python的淺拷貝和深拷貝.潛拷貝(shallow copy) python中潛拷貝指的是:構造一個新的復合對象&#xff0c;然后將原對象中的對象引用插入其中 平常開發過程中潛拷貝是比深拷貝更常見的場景. 比如編程中使用到的一些基本的…

普通大學本科生如何入門強化學習?

問題:你平時是如何緊跟大型語言模型和智能體技術前沿的&#xff1f;有哪些具體的學習和跟蹤方式&#xff1f;回答:我會通過“輸入-內化-實踐”結合的方式跟蹤前沿。首先&#xff0c;學術動態方面&#xff0c;每天花10分鐘瀏覽arXiv的http://cs.CL和http://cs.AI板塊&#xff0c…