網(wǎng)站首頁 編程語言 正文
一、簡單的方法實(shí)現(xiàn)
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 實(shí)現(xiàn)
代碼:
def dedupe(items): ? ? seen = set() ? ?# 集合set是一個(gè)無序不重復(fù)元素集 ? ? 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))是將生成器中的結(jié)果呈現(xiàn)出來
這里對set
和yield進(jìn)行研究。如果不用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]
可以發(fā)現(xiàn)輸出的元素并沒有保持原有的順序,這是因?yàn)閟et的特性導(dǎo)致的。set是一個(gè)一個(gè)無序不重復(fù)元素集,使用 add()方法向set中添加元素時(shí)并不會將元素添加到末尾,而是按照順序插入到了中間位置。
我們可以逐步打印 seen 的內(nèi)容看一下:
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}
可以發(fā)現(xiàn)向集合 {1, 2, 3, 5} 中 add(4),得到的是 {1, 2, 3, 4, 5},而不是 {1, 2, 3, 5, 4},這就是 set 無序性的體現(xiàn)。
那么為什么用 yield 就可以實(shí)現(xiàn)保持順序的功能呢?因?yàn)?yield 生成器會逐個(gè)返回 1, 2, 3, 5, 4
那么為什么 print
(list(dedupe(sequence)) )會輸出 [1, 2, 3, 5, 4] 呢?因?yàn)?list(dedupe(sequence)) 是將生成器中的結(jié)果呈現(xiàn)出來,直接打印生成器 print(dedupe(sequence)) 只會輸出地址,不會輸出內(nèi)容,
三、Python列表去重并保持順序?yàn)槭裁词褂脃ield?
list(dedupe(a))的作用是將生成器中的結(jié)果呈現(xiàn)出來,所以順序沒有改變。修改一下函數(shù)就能看到seen,
如圖:
在函數(shù)中打印seen:
可以看見在中間出現(xiàn)了一個(gè)集合,就是seen,如果去掉print中的list,則打印:
此時(shí)出現(xiàn)了一個(gè)生成器(generator
),但沒有打印print
(seen)。為什么呢?因?yàn)椴徽{(diào)用生成器的話,程序只執(zhí)行到y(tǒng)eild item,不繼續(xù)往下執(zhí)行了。
我們可以使用next()方法調(diào)用生成器:
輸出結(jié)果:
可以看出生成器調(diào)用了第一個(gè)數(shù)值5,此時(shí)停在第二個(gè)數(shù)值處,再用next方法調(diào)用時(shí),將打印第二個(gè)數(shù)值2 ,再用next方法調(diào)用時(shí),將打印第三個(gè)數(shù)值1 :
這里用next調(diào)用生成器時(shí),必須將生成器實(shí)例化,即g = dedupe(a)
,如果仍然用next(dedupe(a))將一直打印5,因?yàn)镻ython會認(rèn)為你又重新調(diào)用了一次函數(shù)。
結(jié)果:
原文鏈接:https://blog.csdn.net/qq_43799400/article/details/123667132
相關(guān)推薦
- 2022-10-03 react中使用useEffect及踩坑記錄_React
- 2022-10-03 Python?numpy.transpose使用詳解_python
- 2023-01-28 C#實(shí)現(xiàn)自定義單選和復(fù)選按鈕樣式_C#教程
- 2022-04-16 python案例練習(xí)合集_python
- 2022-09-17 使用cache加快編譯速度的命令詳解_相關(guān)技巧
- 2022-03-14 Android 截屏在surfaceview上失敗的問題
- 2022-05-21 基于C++實(shí)現(xiàn)信息管理系統(tǒng)_C 語言
- 2023-09-12 過擬合(over fit)和欠擬合(under fit)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支