从 Python 中的列表列表中删除重复项
Remove duplicates from a list of lists in Python
要从列表列表中删除重复项:
- 声明一个新变量并将其设置为一个空列表。
- 遍历列表列表并检查每个嵌套列表是否不在新列表中。
- 如果满足条件,则将列表添加到新列表中。
主程序
list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] new_list = [] for l in list_of_lists: if l not in new_list: new_list.append(l) # 👇️ [['a', 1], ['b', 2], ['c', 3]] print(new_list)
第一步是迭代列表列表。
在每次迭代中,我们检查当前嵌套列表是否不存在于新列表中。
in 运算符
测试成员资格。
例如,如果是 的成员,则x in l
计算为 ,否则计算为。True
x
l
False
x not in l
返回 的否定x in l
。
如果满足条件,我们使用该
list.append()
方法将列表添加到新列表中。list.append
()
方法将一个项目添加到列表的末尾。
新列表不包含任何重复列表。
或者,您可以使用该itertools.groupby
方法。
要从列表列表中删除重复项:
- 使用
list.sort()
方法对列表进行排序。 - 使用
itertools.groupby
方法对嵌套列表进行分组。 - 使用
list()
该类将结果转换为列表。
主程序
import itertools list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] # 👇️ sort list first list_of_lists.sort() new_list = list(l for l, _ in itertools.groupby(list_of_lists)) # 👇️ [['a', 1], ['b', 2], ['c', 3]] print(new_list)
我们使用
itertools.groupby
方法从列表列表中删除重复项。
请注意,在我们使用该方法之前必须对列表进行排序,groupby
因为每次键更改时该方法都会生成一个新组。
主程序
import itertools list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] # 👇️ sort list first list_of_lists.sort() # 👇️ [(['a', 1], <itertools._grouper object at 0x7fb416cdf520>), (['b', 2], <itertools._grouper object at 0x7fb416cdf550>), (['c', 3], <itertools._grouper object at 0x7fb416cddbd0>)] print(list(itertools.groupby(list_of_lists)))
我们使用生成器表达式迭代迭代器并使用下划线忽略itertools._grouper
对象。
主程序
import itertools list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] # 👇️ sort list first list_of_lists.sort() new_list = list(l for l, _ in itertools.groupby(list_of_lists)) # 👇️ [['a', 1], ['b', 2], ['c', 3]] print(new_list)
生成器表达式用于对每个元素执行某些操作或选择满足条件的元素子集。
请注意,此方法要求我们提前对列表进行排序。
list.sort方法对列表进行就地
排序,它只使用<
项目之间的比较。
或者,您可以将列表列表转换为集合。
要从列表列表中删除重复项:
- 使用列表理解将每个嵌套列表转换为元组。
- 将元组列表转换为 a
set
以删除重复项。 - 使用列表理解将 转换
set
为列表列表。
主程序
list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] my_set = set(tuple(l) for l in list_of_lists) new_list = [list(tup) for tup in my_set] print(new_list) # 👉️ [['a', 1], ['c', 3], ['b', 2]]
请注意,在转换为 a 之前,我们必须将每个嵌套列表tuple
转换为 a set
。
这是必要的,因为元组是不可变的和可散列的,而列表是可变的和不可散列的(不能是 a 的成员set
)。
Set 对象是唯一元素的无序集合,因此当我们将元组列表转换为 aset
时,所有重复项都会自动删除。
但要注意一件事——
set
对象是无序的,因此您不能保证列表中项目的顺序将被保留。主程序
list_of_lists = [['a', 1], ['b', 2], ['a', 1], ['b', 2], ['c', 3]] my_set = set(tuple(l) for l in list_of_lists) new_list = [list(tup) for tup in my_set] print(new_list) # 👉️ [['c', 3], ['a', 1], ['b', 2]]
如果您需要确保保留列表中元组的顺序,请使用for
循环解决方案。
set()类接受一个可迭代的可选参数,并返回一个新对象set
,其中的元素取自可迭代对象。