Python

您所在的位置:网站首页 对列表去重python Python

Python

2023-06-22 15:36| 来源: 网络整理| 查看: 265

文章目录 列表去重字典去重

列表去重

在Python中,可以使用多种方法对列表进行去重,以下介绍几种常用的方法:

方法一:使用set()函数

将列表转换为集合,由于集合元素不可重复,这样就快速将列表中的重复元素去除:

list1 = [1, 2, 3, 2, 5, 1] new_list = list(set(list1)) print(new_list) # 输出[1, 2, 3, 5]

方法二:使用列表推导式

遍历原始列表,将不重复的元素添加到新列表中,这样也能实现去重:

list1 = [1, 2, 3, 2, 5, 1] new_list = [] [new_list.append(i) for i in list1 if i not in new_list] print(new_list) # 输出[1, 2, 3, 5]

方法三:使用Python标准库collections模块中的OrderedDict类

使用OrderedDict类,由于它是一个有序字典,元素的顺序是按照首次出现的先后顺序来确定的,因此只需利用OrderedDict类去重即可:

from collections import OrderedDictlist1 = [1, 2, 3, 2, 5, 1] new_list = list(OrderedDict.fromkeys(list1)) print(new_list) # 输出[1, 2, 3, 5]

以上三种方法都可以很好地对列表进行去重。其中,第一种方法使用set()函数最为简单,但是输出结果无序;第二种方法使用列表推导式比较灵活,但是需要注意使用方式;第三种方法使用有序字典具有一定的可读性和可维护性。

字典去重

当使用类似于set()函数这样的哈希表结构进行去重时,可能会出现"TypeError: unhashable type: ‘dict’"错误,这是因为Python中哈希表的键(即可哈希对象)必须是不可变类型,例如数字、字符串、元组等,而字典是可变类型,无法作为键值使用。

要解决这个问题,可以使用其他方法对包含字典的列表进行去重。以下是两种常用的方法:

方法一:使用列表推导式和字典的keys()方法

使用列表推导式遍历原始列表,将字典的键值取出来形成一个新的列表,再对新列表去重,最后以该列表为基础,通过遍历每个子字典,筛选出不重复的子字典,形成最终目标列表:

list1 = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 28}, {'name': 'Alice', 'age': 25}] key_list = list(set([frozenset(d.items()) for d in list1])) new_list = [] for item in key_list:for d in list1:if frozenset(d.items()) == item:new_list.append(d)break print(new_list) # 输出[{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 28}]

以上代码中,我们首先使用列表推导式遍历原始列表,将每个字典对象转换为其键值对集合(frozenset类型),再对这些集合进行去重,得到不重复的键值对列表。然后,我们在遍历原始列表时,使用frozenset()函数将每个子字典对象转换为键值集合,若该集合在不重复的集合列表中,则将该字典对象添加到新列表中。

方法二:使用Python标准库itertools.groupby()函数

使用Python标准库中的itertools.groupby()函数对原始列表进行分组处理,将具有相同键值对的子字典放在一起,取第一个子字典作为目标列表中的元素:

import itertoolslist1 = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 28}, {'name': 'Alice', 'age': 25}] key_func = lambda d: frozenset(d.items()) new_list = [next(v) for _, v in itertools.groupby(sorted(list1, key=key_func), key=key_func)] print(new_list) # 输出[{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 28}]

以上代码中,我们首先定义了一个lambda函数key_func,用于将字典对象转换为其键值对集合(frozenset类型)。然后,我们使用sorted()函数按照键值对集合的大小进行排序,再使用itertools.groupby()函数对排序后的列表进行分组处理,将拥有相同键值对集合的子字典放在一起。最后,我们对每个分组取第一个元素作为目标列表中的元素,并使用列表推导式将它们组成一个新列表。

无论是哪种方法,都可以实现对包含字典的列表进行去重,但是需要注意的是,由于这些方法涉及到多次遍历和计算,所以在处理大规模数据时效率可能较低。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3