精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python 字典組成的數(shù)組怎么進(jìn)行去重?

你知道嗎?如果數(shù)組是字典組成的,直接對(duì)數(shù)組內(nèi)的字典采用set的方式進(jìn)行去重,會(huì)報(bào)錯(cuò):

test = [{'a': 1}, {'a': 1}, {'a': 3}, {'b': 4}]
test = list(set(test))
>>> TypeError: unhashable type: 'dict'

因?yàn)槭褂胹et去重的前提是該對(duì)象為不可變對(duì)象,而字典是可變對(duì)象,因此無法直接使用該方法去重。

那么怎么解決這個(gè)問題呢?有三個(gè)辦法。


1.使用reduce方法

reduce() 函數(shù)會(huì)對(duì)參數(shù)序列中元素進(jìn)行累積。

比如:

from functools import reduce
def add(x, y) :            # 兩數(shù)相加
    return x + y

print(reduce(add, [1,2,3,4,5])) # 計(jì)算列表和:1+2+3+4+5
# 15

上述寫法也能用lambda函數(shù)簡化為:

from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5])) # 使用 lambda 匿名函數(shù)
# 15

因此,我們自己編寫一個(gè)函數(shù)進(jìn)行數(shù)組內(nèi)的字典去重:

from functools import reduce

data = [{'a': 1}, {'a': 1}, {'a': 3}, {'b': 4}]
result = []
def unduplicate(result, data):
    if data not in result:
        result = result + [data]
    return result

for i in data:
    result = unduplicate(result, i)

print(result)
# [{'a': 1}, {'a': 3}, {'b': 4}]

稍顯復(fù)雜,如果使用reduce函數(shù)和lambda函數(shù),代碼能簡化很多:

def delete_duplicate(data):
    func = lambda x, y: x + [y] if y not in x else x
    data = reduce(func, [[], ] + data)
    return data

print(delete_duplicate(data))
# [{'a': 1}, {'a': 3}, {'b': 4}]

當(dāng)然, 我也能一行寫完這個(gè)功能:

data = reduce(lambda x, y: x + [y] if y not in x else x, [[], ] + data)

只不過有可能會(huì)被打死在工位上,所以不建議這么干。


2.奇怪的技巧

就如文章開頭提到的,字典之所以不能用set去重,是因?yàn)樗强勺儗?duì)象。

但是...如果我們把它變成不可變對(duì)象呢?

data = [{'a': 1}, {'a': 1}, {'a': 3}, {'b': 4}]
def delete_duplicate(data):
    immutable_dict = set([str(item) for item in data])
    data = [eval(i) for i in immutable_dict]
    return data
print(delete_duplicate(data))
# [{'a': 1}, {'a': 3}, {'b': 4}]

沒錯(cuò),這能成。


1.遍歷字典,將每個(gè)子項(xiàng)變成字符串存放到數(shù)組中,再通過set函數(shù)去重。

2.通過eval函數(shù),將去重后的數(shù)組里的每個(gè)子項(xiàng)重新轉(zhuǎn)化回字典。

如此Python,怎能不好玩?

3.高效的方式

上面講了兩種騷操作,其實(shí)都不太建議在實(shí)際工作中使用。

一個(gè)原因是真的太騷了,怕被打趴在工位上。

另一個(gè)原因是,它們?cè)趹?yīng)對(duì)較大數(shù)據(jù)量的時(shí)候,性能不太行。

下面是最正統(tǒng)的方式:

data = [dict(t) for t in set([tuple(d.items()) for d in data])]
# data:
# [{'a': 1}, {'b': 2}]

其實(shí)和第二種方式一樣,是將數(shù)組內(nèi)的每個(gè)字典轉(zhuǎn)成元組,也就是不可變對(duì)象,再使用set進(jìn)行去重。去重完畢后再使用dict函數(shù)將元組重新組成字典對(duì)。

但是,這種方法對(duì)于字典內(nèi)還有字典的數(shù)據(jù)結(jié)構(gòu)是不適用的,因此對(duì)于字典對(duì)里還有字典情況的去重,比如:

data2 = [{'a': {'b': 'c'}}, {'a': {'b': 'c'}}]

這種情況我建議使用第二種方式去重:

data2 = [{'a': {'b': 'c'}}, {'a': {'b': 'c'}}]
def delete_duplicate_str(data):
    immutable_dict = set([str(item) for item in data])
    data = [eval(i) for i in immutable_dict]
    return data
print(delete_duplicate_str(data2))
# [{'a': {'b': 'c'}}]

怎么樣,這三種方式你都學(xué)會(huì)了嗎?

如果覺得有收獲的話記得收藏一下。以后遇到類似的去重場景時(shí)可以拿出閱讀一下。

我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實(shí)戰(zhàn)教程,請(qǐng)持續(xù)關(guān)注Python實(shí)用寶典。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
零基礎(chǔ)入門Python:基本命令、函數(shù)、數(shù)據(jù)結(jié)構(gòu)
Python
Python3基礎(chǔ)之函數(shù)用法
史上最全的 python 基礎(chǔ)知識(shí),沒有比這再全面的了,建議收藏
day11作業(yè)
Python高效編程技巧
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 前郭尔| 新巴尔虎左旗| 商城县| 陇西县| 涿州市| 三门县| 茂名市| 湖州市| 萍乡市| 江永县| 亳州市| 亚东县| 都匀市| 巴里| 广饶县| 沛县| 温宿县| 漯河市| 泊头市| 茂名市| 安康市| 四平市| 筠连县| 屯留县| 城口县| 辽源市| 西安市| 绥芬河市| 天峨县| 托克托县| 蒲江县| 仁怀市| 赤峰市| 临颍县| 商城县| 陇南市| 丁青县| 苏尼特右旗| 观塘区| 浮山县| 济源市|