- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 539字
- 2021-04-30 12:39:42
3.1.3 序列去重并保持順序
從序列中刪除元素或刪除重復元素是非常頻繁的操作,若需要在刪除的同時保持序列中元素的順序,怎樣操作可以更優雅且高效地完成刪除?
如果序列上的值都是hashable類型,那么可以簡單地利用集合或者生成器來解決這個問題,代碼(sequence_delete_exp.py)示例如下:
def dedupe_1(items): seen = set() for item in items: if item not in seen: yield item seen.add(item) sequence_v = [1, 2, 3, 5, 2, 3] print(list(dedupe_1(sequence_v)))
執行py文件,輸出結果如下:
[1, 2, 3, 5]
當序列中元素為hashable類型時,上述處理方法沒有問題;當序列中元素不是hashable類型時(比如dict類型),這種寫法就做不到去重。
如果元素不可哈希,要消除序列中重復元素,需要將上述代碼稍做改變,代碼(sequence_delete_exp.py)示例如下:
def dedupe_2(items, key=None): seen = set() for item in items: # val = item if key is None else key(item) if (val := item if key is None else key(item)) not in seen: yield item seen.add(val) sequence_v = [{'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}] print(list(dedupe_2(sequence_v, key=lambda d: (d['x'],d['y'])))) print(list(dedupe_2(sequence_v, key=lambda d: d['x'])))
執行py文件,輸出結果如下:
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}] [{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
示例代碼中使用了Python3.8的新特性——賦值表達式(:=),在后續的很多地方會用到該表達式。
代碼中的key參數指定了一個函數,用于將序列元素轉換成hashable類型。
如果想基于單個字段、屬性或者某個更大的數據結構來消除重復元素,該方案同樣可以勝任。如果只是想消除重復元素,簡單地構造一個set集合即可實現。使用set集合不能維護元素的順序,生成的結果中的元素位置會被打亂。
上面示例中使用了生成器函數,使得定義的函數更加通用。
推薦閱讀
- Java逍遙游記
- HTML5+CSS3+JavaScript從入門到精通:上冊(微課精編版·第2版)
- Java 開發從入門到精通(第2版)
- C# 2012程序設計實踐教程 (清華電腦學堂)
- C#完全自學教程
- Learning ArcGIS Pro 2
- Production Ready OpenStack:Recipes for Successful Environments
- Python王者歸來
- SEO實戰密碼
- Python圖形化編程(微課版)
- Android傳感器開發與智能設備案例實戰
- Citrix XenServer企業運維實戰
- C++編程兵書
- .NET 4.5 Parallel Extensions Cookbook
- Instant Zurb Foundation 4