python-進階教程-從序列中移除重複項並保持元素順序不變
阿新 • • 發佈:2018-12-18
0.摘要
本文主要介紹去除序列中重複的元素,並保持剩下元素順序不變的方法。
1.轉set()
如果只想去除重複元素,而不關心順序問題,可以將序列轉為set,從而達到簡單快速去重的效果。
a = [1,2,3,4,5,6,5,4,3,2,1,7,8,9]
a = list(set(a))
print(a)
#result:[1, 2, 3, 4, 5, 6, 7, 8, 9]
再次強調,這種方法不能保證剩下的元素順序不變。
2.藉助集合和生成器
def dedupe(items): seen = set() for item in items: if item not in seen: yield item seen.add(item) if __name__ == '__main__': a = [1, 5, 2, 1, 9, 1, 5, 10] print(a) print(list(dedupe(a)))
注意:這種方法只有在序列中的元素是可雜湊的時候才適用。
可雜湊:如果一個物件是可雜湊的,那麼在它的生存期內必須是不可變的,他需要有一個__hash__()方法。整數、浮點數、字串、元組都是不可變得。
3.不可雜湊物件
如果序列中物件不可雜湊,那麼可以先將物件轉為可雜湊的。這裡模仿sorted、max()、min()方法,設定一個key引數。
# example2.py # # Remove duplicate entries from a sequence while keeping order def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item) if val not in seen: yield item seen.add(val) if __name__ == '__main__': a = [ {'x': 2, 'y': 3}, {'x': 1, 'y': 4}, {'x': 2, 'y': 3}, {'x': 2, 'y': 3}, {'x': 10, 'y': 15} ] print(a) print(list(dedupe(a, key=lambda a: (a['x'],a['y']))))
4.實際應用
在實際應用中,我們處理的資料並不侷限於列表,比如去除重複文字行也可以使用這樣的方法。
with open(file_path,'r') as f:
for line in dedupe(f):
……