先上一下可哈希數(shù)據(jù)結(jié)構(gòu)重復(fù)元素去除方法:
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
不可哈希數(shù)據(jù)結(jié)構(gòu)的方法類似:
def dedupe(items, key=None):
seen = set() #這里利用了set的特點(diǎn),即無重復(fù)元素
for item in items:
val = item if key is None else key(item) #處理數(shù)據(jù),使之變成可以比較的格式,即把數(shù)據(jù)解構(gòu),其中key為解構(gòu)函數(shù),val為解構(gòu)后的數(shù)據(jù)
if val not in seen:
yield item #這里要塞入generator的是item,因?yàn)関al只是為了方便處理生成的“中間數(shù)據(jù)”,并沒有什么卵用
seen.add(val)
下面說一下使用這個(gè)函數(shù)的方法:
測(cè)試數(shù)據(jù):
items = [{'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
函數(shù)調(diào)用的兩個(gè)示例:
1.本例中的匿名函數(shù)(即“解構(gòu)函數(shù)”)表示的含義是以(x,y)這個(gè)整體為主鍵,去除items中與之重復(fù)的元素
print(list(dedupe(items, key=lambda d: (d['x'], d['y']))))
控制臺(tái)輸出結(jié)果如下:
[{'y': 2, 'x': 1}, {'y': 3, 'x': 1}, {'y': 4, 'x': 2}]
2.本例中的匿名函數(shù)(即“解構(gòu)函數(shù)”)以x為主鍵
print(list(dedupe(items, key=lambda d: d['x'])))
控制臺(tái)輸出結(jié)果如下:
[{'y': 2, 'x': 1}, {'y': 4, 'x': 2}]
這里用lambda寫解構(gòu)函數(shù)很方便,值得學(xué)習(xí)。
另外注意一下此處的 list (代碼中dedupe外面的那一個(gè)),可以直接把generator轉(zhuǎn)換為list,使用起來很方便。