Python嵌套列表去重并保持原始顺序的实现方法
本文介绍如何在Python中对嵌套列表进行去重,同时保留元素出现的原始顺序。通过示例展示直接使用set会导致顺序混乱,进而利用sort方法的key参数结合索引定位,实现既去重又保序的高效解决方案。
发现问题
Python中的嵌套列表结构十分常见,但在实际工作场景中,我们可能会遇到一个棘手的问题。让我们先来看一下具体的案例背景。
raw_list = [["百度", "CPY"], ["京东", "CPY"], ["黄轩", "PN"], ["百度", "CPY"]]
假设我们有一个包含嵌套列表的原始数据,其中存在重复的子列表元素,例如[["百度", "CPY"], ["京东", "CPY"], ["黄轩", "PN"], ["百度", "CPY"]]。我们的目标是对这些嵌套列表进行去重处理,即去除完全相同的子列表,同时必须严格保持元素在原始列表中的先后顺序。最终输出的结果应当依然是嵌套列表的形式,预期结果类似于:[["百度", "CPY"], ["京东", "CPY"], ["黄轩", "PN"]]。
在Python中,处理数据去重最直观的方法通常是使用集合(set),因此我首先尝试利用这一思路来解决当前问题。
In [8]: new_list = [list(t) for t in set(tuple(_) for _ in raw_list)] In [9]: new_list Out[9]: [['京东', 'CPY'], ['百度', 'CPY'], ['黄轩', 'PN']]
然而,初步实现后发现,虽然重复元素被成功去除,但嵌套列表原有的排列顺序发生了改变。
为了解决这个问题,我们需要逐步排查导致顺序变化的具体环节。
In [10]: s = set(tuple(_) for _ in raw_list)
In [11]: s
Out[11]: {('京东', 'CPY'), ('百度', 'CPY'), ('黄轩', 'PN')}
经过分析,问题根源在于集合(set)的两个核心特性:无序性和不重复性。由于集合内部存储结构的随机性,它无法保证元素的插入顺序。
既然依赖set直接解决排序问题行不通,我们并未放弃。现在的核心任务转化为:如何将去重后的列表(new_list)重新按照原始列表(raw_list)中元素的顺序进行排序。这可以通过Python的sort方法来实现。
查阅Python官方文档后,我们找到了关于排序机制的关键说明。
相关文档链接
sort(*, key=None, reverse=False) This method sorts the list in place, using only < comparisons between items. Exceptions are not suppressed - if any comparison operations fail, the entire sort operation will fail (and the list will likely be left in a partially modified state). [`sort()`](https://docs.python.org/3/library/stdtypes.html?highlight=sort#list.sort "list.sort") accepts two arguments that can only be passed by keyword ( [keyword-only arguments](https://docs.python.org/3/glossary.html#keyword-only-parameter) ): key specifies a function of one argument that is used to extract a comparison key from each list element (for example, key=str.lower). The key corresponding to each item in the list is calculated once and then used for the entire sorting process. The default value of None means that list items are sorted directly without calculating a separate key value.
接下来重点解读文档中的关键信息:
sort方法提供了一个名为key的参数,该参数用于指定一个排序依据函数。
具体来说,key参数的值应当是一个函数。这个函数会对new_list中的每个元素执行一次计算,产生一个结果值,sort方法随后依据这些结果值对列表进行排序。
基于上述原理,我们可以构思一种解决方案:计算new_list中每个元素在原始列表raw_list中的索引位置,然后依据这些索引值对new_list进行排序,从而恢复原始顺序。
具体的代码实现如下所示:
In [13]: new_list.sort(key=raw_list.index) In [14]: new_list Out[14]: [['百度', 'CPY'], ['京东', 'CPY'], ['黄轩', 'PN']]
执行上述代码后,输出结果与我们的预期完全一致。
总结
以上就是本文介绍的全部内容。希望这篇关于Python嵌套列表去重且保序的文章能为你的学习或工作提供有价值的参考。如果在实践过程中有任何疑问,欢迎留言交流。感谢大家对本站的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













