> 文章列表 > Python | 一文学会Python中如何将列表去重,拓展字典去重

Python | 一文学会Python中如何将列表去重,拓展字典去重

Python | 一文学会Python中如何将列表去重,拓展字典去重

文章目录

列表去重

在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()函数对排序后的列表进行分组处理,将拥有相同键值对集合的子字典放在一起。最后,我们对每个分组取第一个元素作为目标列表中的元素,并使用列表推导式将它们组成一个新列表。

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