網站首頁 編程語言 正文
一、簡單的方法實現
def dedupe(items): ? ? seen = [] ? ? for item in items: ? ? ? ? if item not in seen: ? ? ? ? ? ? seen.append(item) ? ? return seen sequence = [1, 2, 3, 5, 2, 3, 4] print((dedupe(sequence))) ? ?# [1, 2, 3, 5, 4]
二、用 set 和 yield 實現
代碼:
def dedupe(items): ? ? seen = set() ? ?# 集合set是一個無序不重復元素集 ? ? for item in items: ? ? ? ? if item not in seen: ? ? ? ? ? ? yield item ? ? ? ? ? ? seen.add(item) ? ? ? ? ? sequence = [1, 2, 3, 5, 2, 3, 4] print(list(dedupe(sequence))) ? ?# [1, 2, 3, 5, 4] # list(dedupe(sequence))是將生成器中的結果呈現出來
這里對set
和yield進行研究。如果不用yield可不可以呢,畢竟用生成器會很難理解,那么首先去掉yied
,返回seen:
def dedupe(items): ? ? seen = set() ? ? for item in items: ? ? ? ? if item not in seen: ? ? ? ? ? ? seen.add(item) ? ? return seen sequence = [1, 2, 3, 5, 2, 3, 4] print(list(dedupe(sequence))) ? ?# [1, 2, 3, 4, 5]
可以發現輸出的元素并沒有保持原有的順序,這是因為set的特性導致的。set是一個一個無序不重復元素集,使用 add()方法向set中添加元素時并不會將元素添加到末尾,而是按照順序插入到了中間位置。
我們可以逐步打印 seen 的內容看一下:
def dedupe(items): ? ? seen = set() ? ? for item in items: ? ? ? ? if item not in seen: ? ? ? ? ? ? seen.add(item) ? ? ? ? ? ? print("seen: ",seen) ? ? return seen sequence = [1, 2, 3, 5, 2, 3, 4] print("sequence元素: ",dedupe(sequence)) # output: seen: ?{1} seen: ?{1, 2} seen: ?{1, 2, 3} seen: ?{1, 2, 3, 5} seen: ?{1, 2, 3, 4, 5} sequence元素: ?{1, 2, 3, 4, 5}
可以發現向集合 {1, 2, 3, 5} 中 add(4),得到的是 {1, 2, 3, 4, 5},而不是 {1, 2, 3, 5, 4},這就是 set 無序性的體現。
那么為什么用 yield 就可以實現保持順序的功能呢?因為 yield 生成器會逐個返回 1, 2, 3, 5, 4
那么為什么 print
(list(dedupe(sequence)) )會輸出 [1, 2, 3, 5, 4] 呢?因為 list(dedupe(sequence)) 是將生成器中的結果呈現出來,直接打印生成器 print(dedupe(sequence)) 只會輸出地址,不會輸出內容,
三、Python列表去重并保持順序為什么使用yield?
list(dedupe(a))的作用是將生成器中的結果呈現出來,所以順序沒有改變。修改一下函數就能看到seen,
如圖:
在函數中打印seen:
可以看見在中間出現了一個集合,就是seen,如果去掉print中的list,則打印:
此時出現了一個生成器(generator
),但沒有打印print
(seen)。為什么呢?因為不調用生成器的話,程序只執行到yeild item,不繼續往下執行了。
我們可以使用next()方法調用生成器:
輸出結果:
可以看出生成器調用了第一個數值5,此時停在第二個數值處,再用next方法調用時,將打印第二個數值2 ,再用next方法調用時,將打印第三個數值1 :
這里用next調用生成器時,必須將生成器實例化,即g = dedupe(a)
,如果仍然用next(dedupe(a))將一直打印5,因為Python會認為你又重新調用了一次函數。
結果:
原文鏈接:https://blog.csdn.net/qq_43799400/article/details/123667132
相關推薦
- 2021-12-06 Atlassian系列產品及插件激活方法[JIRA8.19.0+]_其它綜合
- 2022-07-21 IC設計中glitch free時鐘選擇器的設計過程
- 2022-06-21 C語言數組的各種操作梳理_C 語言
- 2022-10-16 Python?numpy生成矩陣基礎用法實例代碼_python
- 2022-12-08 C++中cout輸出中文信息亂碼問題及解決_C 語言
- 2022-04-25 C#使用Npoi導出Excel并合并行列_C#教程
- 2022-08-15 使用enum關鍵字定義的枚舉類實現接口的情況
- 2023-10-25 對于Echarts實例化與銷毀的一些運用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支