需求:
我們想去除序列中出現(xiàn)的重復(fù)元素复濒,但仍然保證剩下的元素順序不變惭聂。如果想要做的只是去除重復(fù)項(xiàng),通常構(gòu)建一個(gè)集合就可以做到袱吆,但是集合不能保證元素間的順序不變厌衙,因此得到的結(jié)果會(huì)被打亂,下面展示的函數(shù)可以很好的解決:
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)
這里的參數(shù)key的作用是指定一個(gè)函數(shù)來(lái)將序列中的元素轉(zhuǎn)換為可哈希的類(lèi)型绞绒,這么做的目的是為了檢測(cè)重復(fù)項(xiàng)婶希。它可以這樣工作:
a = [{'x':1,'y':2},{'x':1,'y':3},{'x':1,'y':2},{'x':2,'y':3}]
list(dedupe(a,key=lambda i: (i['x'],i['y'])))
Out: [{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 3}]
list(dedupe(a,key=lambda i: i['x']))
這個(gè)函數(shù)可以通用,比如想讀一個(gè)文件蓬衡,去除其中重復(fù)的文本行喻杈,可以只需這樣處理:
with open(somefile,'r') as f:
for line in dedupe(f):
以上內(nèi)容摘自《python cookbook》ff