上一篇文章: Python實用技法第8篇:在兩個字典中尋找相同點
下一篇文章: Python實用技法第10篇:對切片命名
咱們想去除序列出現的重複元素,但仍然保持剩下的元素的順序不變。
若是隻是想要去重,那麼一般足夠簡單的方法就是構建一個集合:segmentfault
a=[1,5,4,36,7,8,2,3,5,7] #結果爲:{1, 2, 3, 4, 5, 36, 7, 8} print(set(a))
若是序列中的值是可哈希的(hashable),那麼這個問題能夠經過使用集合和生成器輕鬆解決。函數
若是一個對象是可哈希的,那麼它的生存期內必須是不可變的,它須要有一個
__hash__()
方法。整數、浮點數、字符串、元素都是不可變的。
def dedupe(items): seen=set() for item in items: if item not in seen: yield item seen.add(item) a=[1,2,3,1,9,1,5,10] print(list(dedupe(a)))
運行結果:code
[1, 2, 3, 9, 5, 10]
只有當序列中的元素是可哈希的時候才能這麼作。若是想在不可哈希的對象序列中去除重複項,須要上述代碼稍做修改:對象
def dedupe(items,key=None): seen=set() for item in items: value=item if key is None else key(item) if value not in seen: yield item seen.add(value) a=[ {'x':1,'y':2}, {'x':1,'y':3}, {'x':1,'y':4}, {'x':1,'y':2}, {'x':1,'y':3}, {'x':1,'y':1}, ] print(list(dedupe(a,key=lambda d:(d['x'],d['y'])))) print(list(dedupe(a,key=lambda d:d['y'])))
運行結果:字符串
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}] [{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}]
這裏的參數key的做用是指定一個函數用來將序列中的元素轉換爲可哈希的類型,那麼作的目的是爲了檢測重複項。get
上一篇文章: Python實用技法第8篇:在兩個字典中尋找相同點
下一篇文章: Python實用技法第10篇:對切片命名