Python推導式 - 最全用法

来源:https://www.cnblogs.com/smiler/p/18132453
-Advertisement-
Play Games

1、 Pythonic - 很Python 寫一段代碼生成1到100之間的數字的平方的列表,答案是: 1, 4, 9, 16... 如果你這樣寫,你就不Pythonic了: 解釋 nums = [] for i in range(1, 101): nums.append(i*i) print(num ...


1、 Pythonic - 很Python

寫一段代碼生成1到100之間的數字的平方的列表,答案是:

1, 4, 9, 16...

如果你這樣寫,你就不Pythonic了:

解釋  
nums = []
for i in range(1, 101):
    nums.append(i*i)
print(nums)

正確的寫法是使用Python的推導式:

nums = [i*i for i in range(1, 101)] 

2、 帶條件的推導式

生成一個列表,包含1到100之間是3的倍數的數字的方法:

9, 36, 81...

代碼:

nums = [i * i for i in range(1, 101) if i % 3 == 0]

3、 帶條件的表達式

生成一個列表,如果是3的倍數就用平方,否則就用是數字本身:

1, 2, 9, 4, 5, 36...

代碼:

nums = [i * i if i % 3 == 0 else i for i in range(1, 101)]

  

結合上面的3個例子,來看一下推導式總結:

  1. 推導式從一個可枚舉數據(列表,元組,集合,字典等)推導出一個列表。也可以推導出生成器,集合或字典。
  2. 推導式可以加推導條件,只對符合條件的元素推導
  3. 要推導出的元素使用表達式生成,可以用if else生成不同元素
[表達式 if 表達式條件 else 分支 for i in 序列 if 推導條件]

4、 使用函數

如果推導條件或者表達式特別複雜怎麼辦?可以使用函數。

推導所有1-100之間的所有質數:2,3,5,7...

解釋    
def is_prime(num):
    if num == 1:
        return False
    for i in range(2, num):
        if (num % i) == 0:
            return False
    else:
        return True


p_nums = [i for i in range(1, 100) if is_prime(i)]
print(p_nums)

  

把推導的條件放在函數中,既可以應對複雜的條件,又可以利用推導式的簡潔寫法。

同理,如果生成推導結果的過程很複雜,也可以把邏輯放到函數中。

推導1900到2021年之間所有的年份,標記出閏年,生成結果:

1900, 1901, 1902, 1903, '閏1904'

代碼:

解釋  
def is_run(year):
    if (year % 4) == 0:
        if (year % 100) == 0:
            if (year % 400) == 0:
                return True  # 整百年能被400整除的是閏年
            else:
                return False
        else:
            return True  # 非整百年能被4整除的為閏年
    else:
        return False


ryears = [f'閏{y}' if is_run(y) else y for y in range(1900, 2021)]
print(ryears)

  

5、 嵌套表達式 - 不推薦使用

從2000年到2021年,生成每個月份:'2000年:1月', '2000年:2月', '2020年:3月', ..., '2021年:12月'

monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]

這裡有兩個for迴圈,類似於:

解釋  
monthes = []
for y in range(2000, 2022):
    for m in range(1, 13):
        monthes.append(f'{y}年:{m}月')

  

是不是下麵的特別容易懂?所以兩層的迴圈不推薦使用推導式,哈哈。

那我為什麼還要講?你會碰到有人這麼寫,知道它的存在還是有點必要的。

6、 推導巨大的列表 - 不要這麼乾!

推導出1到100億之間的數字的平方,代碼如下:

nums = [i * i for i in range(1, 10000000000)]

但是這段代碼很可能會卡死你的電腦,除非你的電腦是超級電腦。因為它要在記憶體中做100億次計算,然後保存這100億個數字。

7、 使用生成器

這種情況下,我們應該使用推導生成器,用法很簡單:

  • 把方括弧改成圓括弧就可以了
解釋    
nums = (i * i for i in range(1, 10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))

列印出來是一個生成器:

解釋    
<generator object <genexpr> at 0x7fa0b422feb0>
1
4
9

這是一個生成器,它不會一次性生成100億個數字,只有調用next()的時候,它才會生成一個新的,返回給你。也就是說,同一個時間,只保存一個數字。

8、 推導字典

推導字典的方式和推導列表很相似,只不過:

  1. 使用大括弧
  2. 使用鍵值對

推導一個包含數字和數字平方組成的字典,結果是這樣的:

{1: 1, 2: 4, 3: 9, ..., 100: 10000}

代碼:

nums_dict = {n: n * n for n in range(1, 101)}
print(nums_dict)

反過來,平方在前面,數字在後面:

nums_dict = {n * n:n for n in range(1, 101)}
print(nums_dict)

給下麵的字典按照分數排序:

{'麥叔':59, '張三':87, 'FGA':78, '石石':100, '莫名':90}

排序結果:

{'石石': 100, '莫名': 90, '張三': 87, 'FGA': 78, '麥叔': 59}

代碼:

scores = {'麥叔': 59, '張三': 87, 'FGA': 78, '石石': 100, '莫名': 90}
sored_scores = {item[0]: item[1] for item in sorted(scores.items(), key=lambda item: item[1], reverse=True)}
print(sored_scores)
  1. 先把字典scores變成一個元組列表:scores.items()
  2. 用sorted函數給元組列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)
  3. 排序過程用lambda指定使用元組的第二列排序:key=lambda item:item[1]。預設是是第一列。
  4. 指定倒著排序,也就是分數高的在前面:reverse=True
  5. 使用推導式,把排好序的元組列表,生成一個新的排好序的字典:{item[0]:item[1] for item in ... }

9 推導集合Set

推導集合的方式和列表是一樣的,區別在於:

  1. 使用大括弧,類似於推導字典,但它是單個元素,而不是鍵值對。
  2. 集合會自動過濾掉重覆的元素。

下麵的名字列表,去掉前後空格後去掉重覆的名字:

[ '麥叔', '張三', ' 麥叔 ', 'FGA ', '張小三', 'FGA', '石石',' 莫名','莫名' ]

推導結果:

{'石石', 'FGA', '張小三', '莫名', '張三', '麥叔'}

代碼:

names = [ '麥叔', '張三', ' 麥叔 ', 'FGA ', '張小三', 'FGA', '石石',' 莫名','莫名' ]
new_names = {n.strip() for n in names}
print(new_names)
  Top 收藏 關註 評論
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 描述 我們在使用 node 的 npm 下載依賴的時候,往往下載速度很慢,那是因為 npm 預設的是 npm 處於國外的官方鏡像源。所以需要切換到國內的鏡像源來加速依賴下載。所以本文推薦一款簡單好用 npm 鏡像源管理器,可以方便開發者管理自己的鏡像源。 推薦:npm-registry-nrs ...
  • vscode插件liveserver增加對thymeleaf模板的簡單支持 背景 vscode+liveserver開發時,多個頁面引用的公用靜態資源在每個頁面都寫一個遍比較麻煩,想讓liveserver支持簡單的thymeleaf語法,只要能把公用資源抽出來單獨放到一個文件中聲明即可。 網上找了一 ...
  • Scriptable 腳本合集 iOS桌面組件神器(Scriptable)原創腳本,精美作品收集、分享! 如果喜歡,歡迎點個 ⭐️ Star ⭐️ 給予小支持,感謝您的使用!喜歡這個項目?有好的腳本?請考慮留言來幫助完善它! 如果您使用過程中發現有問題或可以改進的流程,請提出 Issue 或 Pul ...
  • JS解混淆 最近在整理之前和一些同伴的分享資料,發現時間已經過了好久,特此整理一些有價值的分享記錄。 JS混淆 學習js混淆可以逆向分析混淆和加密過程,實戰可用於爬蟲和滲透信息獲取 本文檔用於初步介紹js混淆的基礎概念以及如何解混淆、調試,便於幹掉反爬蟲和滲透信息收集思路拓展 概念解釋 混淆/加密 ...
  • 前言 我們已經介紹了radash的相關信息和部分Array相關方法,詳情可前往主頁查看; 本篇我們繼續介紹radash中Array的相關方法; 下期我們將介紹解析radash中剩餘的 Array相關方法,並整理出Array方法使用目錄,包括文章說明和腦圖說明。 Radash的Array相關方法詳解 ...
  • 大家好,我是 Java陳序員。 今天,給大家介紹一個基於 Vue 全家桶實現的“網易雲”播放器。 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 YesPlayMusic —— 一款高顏值的第三方網易雲播放器,支持 Windows / ...
  • 本文分享自華為雲社區《3月閱讀周·你不知道的JavaScript | ES6生成器,看似同步的非同步流程式控制製表達風格》,作者: 葉一一。 生成器 打破完整運行 JavaScript開發者在代碼中幾乎普遍依賴的一個假定:一個函數一旦開始執行,就會運行到結束,期間不會有其他代碼能夠打斷它並插入其間。 ES ...
  • 目錄一、爬取目標1.1 效果截圖1.2 演示視頻1.3 軟體說明二、代碼講解2.1 爬蟲採集模塊2.2 軟體界面模塊2.3 日誌模塊三、獲取源碼及軟體 一、爬取目標 用python開發的xhs爬蟲採集軟體,可自動抓取小紅書評論數據,並且含二級評論數據。 為什麼有了源碼還開發界面軟體呢?方便不懂編程代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...