鱼C论坛

 找回密码
 立即注册
查看: 3907|回复: 6

python去重

[复制链接]
发表于 2022-7-17 11:50:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
arr = [{'a':2},{'a':5},{'a':2}]
当数组里面的元素是字典时,如何去重
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-17 12:09:00 | 显示全部楼层
本帖最后由 临时号 于 2022-7-17 12:10 编辑

意思是去掉一个{'a':2}吗
如果是,那就这么写
arr = [{'a':2},{'a':5},{'a':2}]
res = []
for i in arr:
    if i not in res:
        res.append(i)
print(res)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 仅次于列表推导式的最优解(至少我想不出其.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-7-17 13:01:26 | 显示全部楼层
临时号 发表于 2022-7-17 12:09
意思是去掉一个{'a':2}吗
如果是,那就这么写

算法效率有点低吧,去重的时间复杂度是O(n^2), 并且一旦字典的键值对很多,算法就很慢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 07:40:38 | 显示全部楼层
本帖最后由 King丨小义 于 2022-7-18 07:55 编辑
临时号 发表于 2022-7-17 12:09
意思是去掉一个{'a':2}吗
如果是,那就这么写


起码我能想到的,用map先将字典转字符串,然后使用set去重。字符串的比较要比字典的比较快多了。集合去重利用哈希表,算法复杂度能降低到O(n)
list(map(eval,set(map(str, arr))))

这段代码的复杂度体现在eval函数上,如果不考虑将字符串再转回字典(即最后要储存为json),代码还可进一步简化
list(set(map(str, arr)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-18 16:17:53 | 显示全部楼层
King丨小义 发表于 2022-7-18 07:40
起码我能想到的,用map先将字典转字符串,然后使用set去重。字符串的比较要比字典的比较快多了。集合去 ...

我其实也想到了用 set() 函数,但是应为其参数必须是不可哈希的,所以得先将每个元素转换为字符串,
但是你这样的出来的结果:
["{'a': 5}", "{'a': 2}"]
还有偏差,需要再遍历一次去掉双引号,因此效率反而落后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 21:01:47 | 显示全部楼层
本帖最后由 King丨小义 于 2022-7-18 21:46 编辑
python爱好者. 发表于 2022-7-18 16:17
我其实也想到了用 set() 函数,但是应为其参数必须是不可哈希的,所以得先将每个元素转换为字符串,
但 ...



键值对少的时候,这个方法确实速度反而慢(但由于少,再慢也慢不到哪去),但键值对一旦多了,这个优势就体现出来了。
func3确实有点问题,我一开始以为是json格式,后来仔细看发现有点区别,在这里写更多是体现没有eval函数下这行代码的速度(或许有更高效的模块能够代替eval,例如json库)。
list(map(json.loads,set(map(json.dumps, arr))))
Snipaste_2022-07-18_21-01-27.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-18 21:24:35 | 显示全部楼层
本帖最后由 King丨小义 于 2022-7-18 21:47 编辑

我应该说明一下应用场景的,这个应用场景是在爬虫中,由于某些原因,导致爬取的数据有重复。
list(map(eval,set(map(str, arr))))
或者
list(map(json.loads,set(map(json.dumps, arr))))
还有就是对于这行代码,理论上它存在一些问题,因为字典的键不一定按照相同顺序排列,所以会导致两个相同的字典被判定成不同的情况。
但是在绝大多数应用场景下,字典的键值对顺序都是在循环中写好的,一般顺序都是固定的,所以也可以适用。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 09:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表