不可哈希的數(shù)據(jù)結(jié)構(gòu)的重復(fù)元素去除方法

先上一下可哈希數(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,使用起來很方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容