0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python字典組成的數(shù)組如何進(jìn)行去重?

汽車電子技術(shù) ? 來(lái)源:Python實(shí)用寶典 ? 作者:Ckend ? 2023-02-24 13:58 ? 次閱讀

你知道嗎?如果數(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ì)象,因此無(wú)法直接使用該方法去重。

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

圖片

1.使用reduce方法

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

比如:

from functools import reduce
>>>def add(x, y) :            # 兩數(shù)相加
...    return x + y
...
>>>reduce(add, [1,2,3,4,5]) # 計(jì)算列表和:1+2+3+4+5
15

上述寫(xiě)法也能用lambda函數(shù)簡(jiǎn)化為:

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

因此,我們自己編寫(xiě)一個(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)

>>> result
>>> [{'a': 1}, {'a': 3}, {'b': 4}]

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

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

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

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

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

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

圖片

2.奇怪的技巧

就如文章開(kāi)頭提到的,字典之所以不能用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
>>> delete_duplicate(data)
>>> [{'a': 1}, {'a': 3}, {'b': 4}]

沒(méi)錯(cuò),這能成。

圖片

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

2.通過(guò)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ì)了嗎?

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 對(duì)象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17368
  • 字典
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    7693
  • SET
    SET
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7928
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python元組和字典使用的基本方法

    Python學(xué)習(xí):2、元組、字典使用的基本方法
    發(fā)表于 04-06 15:12

    python——元組,集合,字典

    python——元組,集合,字典(tuple,set,dict)
    發(fā)表于 05-22 12:30

    python字典

    python字典字典(英文名 dict),它是由一系列的鍵值(key-value)對(duì)組合而成的數(shù)據(jù)結(jié)構(gòu)。字典中的每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),其中鍵,必須是可 hash 的值,如字符串,數(shù)值
    發(fā)表于 02-23 16:54

    python字典高階用法

    ()進(jìn)行集合運(yùn)算,items()同樣可以進(jìn)行集合運(yùn)算。如果現(xiàn)在我們要獲取兩個(gè)字典中 key,value 完全相同的部分。dic1 = {'Python': 1, 'Java': 2,
    發(fā)表于 03-29 17:39

    python合并字典的 7 種方法

    模塊,它專門用于操作可迭代對(duì)象。正好我們字典也是可迭代對(duì)象,自然就可以想到,可以使用 itertools.chain() 函數(shù)先將多個(gè)字典(可迭代對(duì)象)串聯(lián)起來(lái),組成一個(gè)更大的可迭代對(duì)象,然后再
    發(fā)表于 04-08 15:11

    數(shù)組中的變量取值范圍如何進(jìn)行糾正

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)組中變量取值范圍如何進(jìn)行糾正。
    發(fā)表于 12-17 17:08 ?4次下載

    python字典類型的使用和注意事項(xiàng)

    字典類型在實(shí)際的python開(kāi)發(fā)中,使用特別頻繁,結(jié)合本人多年的工作經(jīng)驗(yàn),現(xiàn)將字典的使用以及字典使用注意事項(xiàng)總結(jié)如下:
    的頭像 發(fā)表于 01-19 17:49 ?3478次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>字典</b>類型的使用和注意事項(xiàng)

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的鍵值(key-value)對(duì)組合而成的數(shù)據(jù)結(jié)構(gòu)。 字典中的每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),其中 鍵,必須是可 hash 的值,如字符串
    的頭像 發(fā)表于 02-23 16:54 ?3418次閱讀

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最靈活的數(shù)據(jù)類型
    的頭像 發(fā)表于 02-16 15:02 ?602次閱讀
    <b class='flag-5'>Python</b>-<b class='flag-5'>字典</b>

    Python基礎(chǔ)語(yǔ)法-字典

    字典Python中一種常見(jiàn)的數(shù)據(jù)類型用于存儲(chǔ)具有映射關(guān)系的數(shù)據(jù)。
    的頭像 發(fā)表于 02-23 14:06 ?976次閱讀
    <b class='flag-5'>Python</b>基礎(chǔ)語(yǔ)法-<b class='flag-5'>字典</b>

    簡(jiǎn)述python字典映射嵌套排序和判斷

    python字典是一種鍵值映射,而不是序列。 字典是通過(guò)鍵來(lái)存儲(chǔ)對(duì)應(yīng)值。序列是通過(guò)索引位置來(lái)存儲(chǔ)對(duì)應(yīng)值。
    的頭像 發(fā)表于 02-27 14:52 ?698次閱讀

    Python序列的字典類型介紹

    , 大括號(hào) {} + 鍵值對(duì) k,v 字典Python 項(xiàng)目中最常用的序列類型之一, 對(duì)應(yīng)Java 中常用的 Json 數(shù)據(jù)類型 操作 字典的創(chuàng)建 通過(guò) {} + kv 來(lái)創(chuàng)建 通過(guò)dict()來(lái)
    的頭像 發(fā)表于 03-08 17:35 ?1272次閱讀
    <b class='flag-5'>Python</b>序列的<b class='flag-5'>字典</b>類型介紹

    Python字典組成數(shù)組怎么進(jìn)行

    你知道嗎?如果數(shù)組字典組成的,直接對(duì)數(shù)組內(nèi)的字典采用set的方式進(jìn)行
    的頭像 發(fā)表于 10-17 11:26 ?438次閱讀

    Python 字典組成數(shù)組怎么進(jìn)行

    你知道嗎?如果數(shù)組字典組成的,直接對(duì)數(shù)組內(nèi)的字典采用set的方式進(jìn)行
    的頭像 發(fā)表于 11-01 10:55 ?439次閱讀

    Python列表的4種方式

    列表Python中一種常見(jiàn)的處理方式,任何編程場(chǎng)景都可能會(huì)遇到需要列表的情況。 列表
    的頭像 發(fā)表于 11-02 10:46 ?1329次閱讀
    <b class='flag-5'>Python</b>列表<b class='flag-5'>去</b><b class='flag-5'>重</b>的4種方式