Python推導式大全與實戰:精通列表、字典、集合和生成器推導式【第115篇—python:推導式】

Python推導式大全與實戰:精通列表、字典、集合和生成器推導式

Python語言以其簡潔、優雅的語法而聞名,其中推導式是其獨特之處之一。推導式是一種在一行代碼中構建數據結構的強大方式,它涵蓋了列表、字典、集合和生成器。本篇博客將全面介紹Python中的推導式,并通過實戰演示展示其強大功能。

IMG_20231006_183505

1. 列表推導式

列表推導式是Python中最常見的推導式之一,用于快速創建列表。其語法結構如下:

new_list = [expression for item in iterable if condition]

實例: 通過列表推導式生成1到10的平方數列表。

squares = [x**2 for x in range(1, 11)]
print(squares)

代碼解析: 在這個例子中,我們使用range(1, 11)生成1到10的數字序列,并通過列表推導式計算每個數字的平方,最終得到squares列表。

2. 字典推導式

字典推導式用于創建字典,其語法結構為:

new_dict = {key_expression: value_expression for item in iterable if condition}

實例: 通過字典推導式生成數字與其平方的映射。

squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict)

代碼解析: 在這個例子中,我們使用range(1, 6)生成1到5的數字序列,并通過字典推導式創建了一個字典,其中鍵為數字,值為對應數字的平方。

3. 集合推導式

集合推導式類似于列表推導式,但用于創建集合。其語法結構為:

new_set = {expression for item in iterable if condition}

實例: 通過集合推導式生成1到10的奇數集合。

odd_numbers = {x for x in range(1, 11) if x % 2 != 0}
print(odd_numbers)

代碼解析: 在這個例子中,我們使用range(1, 11)生成1到10的數字序列,并通過集合推導式篩選出奇數,最終得到odd_numbers集合。

4. 生成器推導式

生成器推導式是一種懶加載的推導式,用于生成一個生成器對象。其語法結構為:

new_generator = (expression for item in iterable if condition)

實例: 通過生成器推導式生成1到10的平方數生成器。

squares_generator = (x**2 for x in range(1, 11))
for square in squares_generator:print(square)

代碼解析: 在這個例子中,我們使用生成器推導式創建了一個生成器對象,并通過循環打印每個平方數。生成器是一種高效利用內存的方式,逐個生成元素而不一次性存儲所有元素。

通過這些推導式,你可以在Python中更加高效地處理數據結構,減少代碼量,提高可讀性。深入理解這些推導式的用法將為你的Python編程之旅增添更多的技巧和便利。

5. 嵌套推導式

Python推導式還支持嵌套,可以在一個推導式中使用多個循環和條件語句,構建更為復雜的數據結構。

實例: 通過嵌套列表推導式創建一個九九乘法表。

multiplication_table = [[i * j for j in range(1, 10)] for i in range(1, 10)]
for row in multiplication_table:print(row)

代碼解析: 在這個例子中,我們使用嵌套的列表推導式創建了一個包含九九乘法表的二維列表。外層循環遍歷1到9的數字,內層循環遍歷1到9的數字,并通過表達式i * j計算乘積。

6. 條件表達式

推導式中的條件表達式允許根據條件選擇不同的表達式。

實例: 通過條件表達式在列表推導式中篩選奇數和偶數。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_odd_classification = ["Even" if x % 2 == 0 else "Odd" for x in numbers]
print(even_odd_classification)

代碼解析: 在這個例子中,我們使用條件表達式判斷數字是奇數還是偶數,然后通過列表推導式生成一個包含奇偶分類的列表。

7. 推導式的性能考慮

雖然推導式提供了緊湊的語法,但在處理大規模數據時,需要注意性能問題。生成器推導式通常更適合處理大型數據集,因為它們采用惰性加載的方式,逐個生成元素而不在內存中存儲所有元素。

實例: 使用生成器推導式生成斐波那契數列。

fibonacci_generator = (fibonacci(n) for n in range(10))def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)for number in fibonacci_generator:print(number)

代碼解析: 在這個例子中,我們使用生成器推導式生成斐波那契數列的前10個元素。由于斐波那契數列的計算涉及遞歸,使用生成器推導式可以有效避免內存溢出問題。

通過以上介紹的不同類型的推導式和實際示例,相信你已經對Python中的推導式有了更深入的理解。這些強大的工具使得在Python中處理數據結構變得更加輕松和高效。在實際項目中,合理運用推導式能夠提高代碼的可讀性和性能。

8. 使用推導式進行數據過濾和轉換

推導式不僅可以用于創建數據結構,還可以用于數據的過濾和轉換,使得數據處理更為靈活。

實例: 通過列表推導式過濾出長度大于等于3的單詞。

words = ["apple", "banana", "pear", "kiwi", "orange"]
filtered_words = [word for word in words if len(word) >= 3]
print(filtered_words)

代碼解析: 在這個例子中,我們使用列表推導式遍歷單詞列表,并通過條件表達式len(word) >= 3篩選出長度大于等于3的單詞,最終得到filtered_words列表。

9. 推導式與函數結合

推導式可以與函數結合,進一步提高代碼的簡潔性和可讀性。

實例: 使用列表推導式和函數計算列表中每個元素的平方根。

import mathnumbers = [4, 9, 16, 25, 36]
square_roots = [math.sqrt(num) for num in numbers]
print(square_roots)

代碼解析: 在這個例子中,我們使用math.sqrt()函數計算每個數字的平方根,并通過列表推導式生成包含平方根的列表。

10. 推導式的靈活運用

推導式可以根據實際需求進行靈活運用,組合使用不同類型的推導式。

實例: 使用列表推導式和集合推導式創建一個包含數字平方和的集合。

numbers = [1, 2, 3, 4, 5]
squares_set = {x**2 for x in numbers}
print(squares_set)

代碼解析: 在這個例子中,我們首先使用列表推導式生成數字的平方列表,然后通過集合推導式將其轉化為集合,去除重復的元素,最終得到squares_set集合。

通過這些實例,你可以更全面地理解和運用Python推導式,使得代碼更為簡潔、可讀且高效。推導式是Python語言中的一項強大特性,善用它將使你的代碼更加優雅和易于維護。

11. 推導式在文件處理中的應用

推導式在文件處理中也能發揮巨大作用,例如讀取文件內容并進行處理。

實例: 通過文件讀取和列表推導式獲取文件中所有行的長度。

file_path = 'sample.txt'# 讀取文件并獲取每行的長度
line_lengths = [len(line) for line in open(file_path)]print(line_lengths)

代碼解析: 在這個例子中,我們使用列表推導式一行代碼完成了文件讀取和每行長度的獲取。open(file_path)打開文件,len(line)計算每行的長度,并將結果存儲在line_lengths列表中。

12. 推導式處理多層嵌套數據結構

推導式在處理多層嵌套的數據結構時表現得尤為出色。

實例: 使用嵌套列表推導式將二維列表扁平化。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]# 扁平化嵌套列表
flattened_list = [num for row in matrix for num in row]print(flattened_list)

代碼解析: 在這個例子中,通過嵌套列表推導式,我們將二維列表matrix扁平化為一個一維列表flattened_list。外層循環遍歷行,內層循環遍歷行中的元素,從而快速構建扁平化的列表。

13. 推導式的錯誤處理

推導式中也可以使用異常處理機制,使得代碼更加健壯。

實例: 使用列表推導式過濾掉非整數元素。

mixed_data = [1, 2, 'three', 4, 'five', 6]# 過濾非整數元素
filtered_integers = [num for num in mixed_data if isinstance(num, int)]print(filtered_integers)

代碼解析: 在這個例子中,我們使用isinstance()函數檢查元素是否為整數,通過列表推導式過濾出整數元素,避免了非整數元素引起的錯誤。

通過這些例子,你可以看到推導式在不同場景中的廣泛應用,從文件處理到多層嵌套數據結構的處理,甚至是錯誤處理方面都能展現其強大的表達能力。合理運用推導式,可以讓你的代碼更加簡潔、高效,并提高代碼的可讀性。### 14. 推導式在字典操作中的妙用

推導式同樣在字典操作中展現出其靈活性和便捷性。

實例: 使用字典推導式從兩個列表創建字典。

keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']# 創建字典
data_dict = {key: value for key, value in zip(keys, values)}print(data_dict)

代碼解析: 在這個例子中,我們使用zip()函數將兩個列表打包成元組,然后通過字典推導式創建字典。這種方式非常適合從不同來源的數據構建字典。

15. 推導式的可讀性和維護性

雖然推導式可以讓代碼更為緊湊,但在一些復雜的場景下,過度使用可能導致代碼難以理解。因此,在實際應用中,要根據情況權衡代碼的可讀性和緊湊性。

實例: 使用列表推導式生成斐波那契數列的偶數項,并通過注釋提高可讀性。

fibonacci_numbers = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]# 通過列表推導式篩選斐波那契數列的偶數項
even_fibonacci = [num for num in fibonacci_numbers if num % 2 == 0]print(even_fibonacci)

代碼解析: 在這個例子中,我們使用列表推導式生成斐波那契數列的偶數項,同時通過注釋提供了對代碼的解釋,提高了可讀性。

16. 推導式在數據分析中的應用

推導式在數據分析中常被用于快速處理和轉換數據。

實例: 使用集合推導式去除列表中的重復元素。

data = [1, 2, 3, 2, 4, 5, 3, 6, 7]# 去除重復元素
unique_data = list({x for x in data})print(unique_data)

代碼解析: 在這個例子中,我們使用集合推導式創建了一個集合,自動去除了列表中的重復元素,然后通過list()將集合轉換為列表。

通過這些例子,你可以看到推導式在字典操作、可讀性和維護性、以及數據分析中的廣泛應用。掌握這些用法,可以使得你在實際編碼中更加得心應手,提高代碼效率和可維護性。

17. 推導式在異步編程中的運用

在異步編程中,推導式同樣能夠簡化代碼,提高效率。

實例: 使用列表推導式和異步函數創建異步任務列表。

import asyncioasync def async_task(item):# 異步任務,這里簡單地將數字平方return item**2# 創建異步任務列表
async_tasks = [async_task(num) for num in range(5)]# 執行異步任務
results = asyncio.run(asyncio.gather(*async_tasks))print(results)

代碼解析: 在這個例子中,我們使用列表推導式創建了一個包含異步任務的列表async_tasks,然后通過asyncio.gather()執行這些異步任務,最終得到異步任務的結果列表。

18. 推導式的高級用法

推導式還支持一些高級的用法,如條件表達式的嵌套、多個for子句的組合等。

實例: 使用條件表達式的嵌套在列表推導式中實現FizzBuzz問題。

result = ["Fizz" if i % 3 == 0 else "Buzz" if i % 5 == 0 else i for i in range(1, 16)]
print(result)

代碼解析: 在這個例子中,我們使用了條件表達式的嵌套,根據FizzBuzz問題的規則生成了一個包含結果的列表。

19. 推導式的可讀性與Lambda函數結合

Lambda函數可以與推導式結合,進一步簡化代碼。

實例: 使用Lambda函數和列表推導式計算列表中每個元素的平方。

numbers = [1, 2, 3, 4, 5]
squares = [(lambda x: x**2)(num) for num in numbers]
print(squares)

代碼解析: 在這個例子中,我們使用了Lambda函數,通過列表推導式計算了每個元素的平方,Lambda函數在這里用于定義簡單的平方計算函數。

20. 推導式的限制與適用場景

雖然推導式具有強大的功能,但在某些情況下可能并不是最佳選擇。當推導式變得復雜難以理解時,可以考慮使用傳統的循環結構。

實例: 使用傳統循環結構計算列表中每個元素的階乘。

numbers = [1, 2, 3, 4, 5]
factorials = []
for num in numbers:result = 1for i in range(1, num + 1):result *= ifactorials.append(result)print(factorials)

代碼解析: 在這個例子中,我們使用傳統的嵌套循環結構計算了列表中每個元素的階乘。雖然推導式也能實現,但使用循環結構可能更易理解。

通過這些例子,你可以更深入地理解推導式的高級用法,以及在一些特殊場景下的限制。優雅地使用推導式和其他Python語言特性,能夠提高代碼的可讀性和編程效率。

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

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

相關文章

YOLOv8實例分割實戰:ONNX模型轉換及TensorRT部署

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39320 PyTorch版的YOLOv8支持高性能的實時實例分割。 TensorRT是針對英偉達GPU的加速工具。 ONNX &#xff08;Open Neural Network Exchange&#xff09; 作為一個開放的網絡模型中間表示&#xff08;IR&#xff0…

Redis命令大全

通用命令 KEYS pattern&#xff1a;查找所有符合給定模式&#xff08;pattern&#xff09;的 key。EXISTS key&#xff1a;檢查指定 key 是否存在。TYPE key&#xff1a;返回指定 key 的數據類型。DEL key [key …]&#xff1a;刪除指定的 key。RENAME key newkey&#xff1a;…

spring boot 修復 Spring Framework URL解析不當漏洞(CVE-2024-22243)

漏洞描述 當應用程序使用UriComponentsBuilder來解析外部提供的URL&#xff08;如通過查詢參數&#xff09;并對解析的URL的主機執行驗證檢查時可能容易受到Open重定向攻擊和SSRF攻擊&#xff0c;導致網絡釣魚和內部網絡探測等。 受影響產品或系統 6.1.0 < Spring Framew…

Vue項目的快速搭建

Vue項目的快速搭建 一、下載并安裝node.js二、安裝Vue腳手架三、創建vue項目四、項目啟動五、VS Code下載安裝 一、下載并安裝node.js 首先確保已經安裝了Node.js。如果沒有安裝&#xff0c;可以去官網&#xff08;https://nodejs.org/&#xff09;下載并安裝最新版本的Node.j…

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示應用

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示應用 STC12C5A60S2系列1T 8051單片機管腳圖STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式及配置STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式介紹TM1638鍵盤數碼管模塊概述TM1638鍵盤數碼管…

mybatis-傳遞參數的方式

mybatis 傳遞參數的7種方法 在實際開發過程中&#xff0c;增刪改查操作都要涉及到請求參數的傳遞&#xff0c;今天這節就集中講下在mybatis中傳遞參數的7中方法 單個參數的傳遞很簡單沒有什么好將的&#xff0c;這里主要說下多個參數的傳遞 1、第一種方式 匿名參數 順序傳遞…

[electron]窗口 BrowserWindow

優雅的顯示窗口 const {app, BrowserWindow} require(electron);function createMainwindow(){const mainwindow new BrowserWindow({x: 300,y: 400,width: 600,height: 600,});mainwindow.loadFile(index.html); }app.on(ready, ()>{createMainwindow(); });對于這樣的代…

前端發起請求,后端模型需處理很久,怎樣設置前端直接完成請求響應,后端計算完在返回結果給前端?

在這種情況下&#xff0c;可以采用異步處理的方式來解決。具體步驟如下&#xff1a; 前端發起請求&#xff1a;前端向后端發送請求&#xff0c;但是不等待后端處理完成而是立即得到響應。 后端異步處理&#xff1a;后端接收到請求后&#xff0c;不立即進行處理&#xff0c;而是…

Codeforces Round 886 (Div. 4)----->E. Cardboard for Pictures

一&#xff0c;思路&#xff1a; 這題我們可以通過二分 w來直接得到答案&#xff0c;時間復雜度是nlogn的級別&#xff0c;但是這里有個很坑的地方&#xff0c;就是假如你用二分做&#xff0c;會面臨報 long long 的問題&#xff0c;但是問題不大&#xff0c;直接用 unsigned …

題目:金三銀四求職季:如何脫穎而出

題目&#xff1a;金三銀四求職季&#xff1a;如何脫穎而出 引言&#xff1a; 隨著春天的腳步漸近&#xff0c;對于許多程序員來說&#xff0c;一年中最繁忙、最重要的面試季節也隨之而來。金三銀四&#xff0c;即三月和四月&#xff0c;被廣大程序員視為求職的黃金時期。在這兩…

藍橋杯倒計時 41天 - KMP 算法

KMP算法 KMP算法是一種字符串匹配算法&#xff0c;用于匹配模式串P在文本串S中出現的所有位置。 例如S“ababac&#xff0c;P“aba”&#xff0c;那么出現的所有位置是13。 在初學KMP時&#xff0c;我們只需要記住和學會使用模板即可&#xff0c;對其原理只需簡單理解&#xff…

用Socks5代理游戲,繞過“網絡海關”去探險

1. 出海大冒險的開始 在游戲世界&#xff0c;就像在現實生活中一樣&#xff0c;有時我們需要越過海洋去探索未知的世界。但是&#xff0c;網絡上也有一些“海關”&#xff0c;限制我們訪問某些網站或游戲服務器。這就是我們今天要克服的挑戰&#xff01; 2. Socks5代理&#xf…

Django 官網項目 四

內容&#xff1a; 利用HTTP的post方法&#xff0c;更改數據并顯示。 創建detail.html文件&#xff0c;來創建POST內容 修改應用的視圖文件views.py&#xff0c;vote方法 修改應用的視圖文件views.py&#xff0c;results方法。 創建results.html文件。 結果&#xff1a;單…

.NET開源功能強大的串口調試工具

前言 今天大姚給大家分享一款.NET開源的、功能強大的串口調試工具&#xff1a;LLCOM。 工具介紹 LLCOM是一個.NET開源的、功能強大的串口調試工具。支持Lua自動化處理、串口調試、串口監聽、串口曲線、TCP測試、MQTT測試、編碼轉換、亂碼恢復等功能。 功能列表 收發日志清晰…

將SpringBoot項目改造成solon項目

solon項目介紹 官網 Java “生態型”應用開發框架&#xff1a;更快、更小、更簡單。 啟動快 5 &#xff5e; 10 倍&#xff1b;并發高 2&#xff5e; 3 倍&#xff1b; 內存省 1/3 ~ 1/2&#xff1b;打包縮到 1/2 ~ 1/10&#xff1b;同時支持 java8, java11, java17, java21&a…

數據結構學習(二)字符串

字符串 1. 概念 字符串就是特殊的字符數組&#xff0c;字符數組末尾的元素為 ‘\0’。和數組一樣可以使用arr[i]或*(arri)來訪問元素。 無論是用數組保存字符串&#xff08;如&#xff1a;char arr[] "Hello&#xff0c;World";&#xff09;&#xff0c;還是用指針…

漢諾塔問題(c++題解)

題目描述 1、一次只許移動一個盤 2、任何時候、任何柱子不允許把大盤放在小盤上面。 3、可使用任一一根立柱暫存圓盤。 問&#xff1a;如何使用最少步數實現n個盤子的移動&#xff1f;打印出具體移動方案。 輸入格式 一行一個數n, 1< n < 18 輸出格式 輸出若干行…

關于HTML5表單驗證的方法教程

簡介 HTML5表單驗證是一種在客戶端對用戶輸入進行驗證的方法&#xff0c;可以有效地減少對于服務器端驗證的依賴。通過使用HTML5表單驗證&#xff0c;可以為用戶提供實時的錯誤提示和更好的用戶體驗。本教程將介紹如何在HTML5中使用各種驗證屬性和技術來實現表單驗證。 基本表…

flynn發布服務小結

背景 flynn是一個基于容器的paas平臺&#xff0c;可以快速的發布運行新的應用&#xff0c;用戶只需要提交代碼到git上&#xff0c;flynn就會基于提交的代碼進行發布和部署&#xff0c;本文就簡單看下flynn發布部署的流程 flynn發布服務 1.首先flynn會基于用戶的web代碼構建一…

Nature 研究亮點(Volume 626 Issue 8001, 29 February 2024)

文章目錄 激光雕刻肥皂膜卵細胞的回收系統巴斯克語的起源產后抑郁癥的治療 激光雕刻肥皂膜 研究者&#xff1a;Haitao Xu 和 Yu Zhao&#xff0c;清華大學&#xff0c;北京。 發現&#xff1a;在特定條件下&#xff0c;可以使用激光在肥皂膜上進行雕刻。肥皂膜由洗滌劑分子&am…