成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 字典組成的數組怎么進行去重?

開發 前端
因為使用set去重的前提是該對象為不可變對象,而字典是可變對象,因此無法直接使用該方法去重。那么怎么解決這個問題呢?

你知道嗎?如果數組是字典組成的,直接對數組內的字典采用set的方式進行去重,會報錯:

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

因為使用set去重的前提是該對象為不可變對象,而字典是可變對象,因此無法直接使用該方法去重。

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

1.使用reduce方法

reduce() 函數會對參數序列中元素進行累積。

比如:

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

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

上述寫法也能用lambda函數簡化為:

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

因此,我們自己編寫一個函數進行數組內的字典去重:

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}]

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

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}]

當然, 我也能一行寫完這個功能:

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

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

2.奇怪的技巧

就如文章開頭提到的,字典之所以不能用set去重,是因為它是可變對象。

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

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}]

沒錯,這能成。

  • 遍歷字典,將每個子項變成字符串存放到數組中,再通過set函數去重。
  • 通過eval函數,將去重后的數組里的每個子項重新轉化回字典。

如此Python,怎能不好玩?

  • 高效的方式

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

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

另一個原因是,它們在應對較大數據量的時候,性能不太行。

下面是最正統的方式:

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

其實和第二種方式一樣,是將數組內的每個字典轉成元組,也就是不可變對象,再使用set進行去重。去重完畢后再使用dict函數將元組重新組成字典對。

但是,這種方法對于字典內還有字典的數據結構是不適用的,因此對于字典對里還有字典情況的去重,比如:

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'}}]

怎么樣,這三種方式你都學會了嗎?

本文轉載自微信公眾號「Python實用寶典」,可以通過以下二維碼關注。轉載本文請聯系Python實用寶典公眾號。

責任編輯:武曉燕 來源: Python實用寶典
相關推薦

2021-06-30 06:10:31

數組去重方法數組變量

2024-11-28 10:09:06

2023-12-05 07:59:08

JS小技巧數組對象去重

2023-09-07 13:32:00

MySQL數據庫

2023-10-26 08:28:31

Python數據去重

2022-04-14 15:12:40

Java8Stream列表

2021-12-31 16:16:04

JavaScript數組代碼

2021-11-24 08:43:02

扁平化函數數組

2020-11-08 14:43:25

Python列表去重編程

2019-11-19 08:04:16

JavaHashSet去重

2024-04-10 07:56:38

前端數組uniq

2022-07-06 07:35:19

group byMySQL

2019-08-22 17:19:19

javascript去重數組

2024-01-15 08:39:12

ArraysSetsTypeScript

2020-09-09 08:23:53

URLIP代碼

2015-07-27 09:33:26

備份數據加密工具

2022-03-31 11:18:00

數據運維短視頻

2025-04-24 11:09:13

2025-06-05 00:00:00

向量數據庫線程安全Redis

2020-11-16 07:19:17

線上函數性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文av字幕 | 香蕉视频1024 | 欧美高清成人 | 精品久久久久一区二区国产 | 天天干视频 | 午夜精品久久久 | 91看片视频| 91观看| 久久亚洲欧美日韩精品专区 | 91伊人网| 网址黄| 国产无人区一区二区三区 | 色婷婷精品久久二区二区蜜臂av | 成人高清视频在线观看 | www.嫩草| 久久高潮 | 午夜寂寞影院在线观看 | 成人午夜性成交 | 国产亚洲一区二区精品 | 久久精品视频免费观看 | 在线观看黄视频 | 中文字幕在线免费观看 | 欧美综合在线观看 | 欧美久久久久久久久 | 伊人99| 欧美激情亚洲天堂 | 亚洲国产成人精品久久久国产成人一区 | 日韩高清av| 欧美激情久久久 | 日韩av一区二区在线观看 | 欧美婷婷| 亚洲国产精品一区在线观看 | 国产91丝袜| 免费午夜电影 | 99精品久久 | a在线观看 | 久久亚洲视频 | 日韩视频在线免费观看 | www.99热这里只有精品 | 涩爱av一区二区三区 | 日韩毛片免费看 |