Python嵌套列表去重

作者: xhades | 来源:发表于2017-12-27 20:53 被阅读85次

人生苦短
早用Python

这是工作中遇到的一个坑,首先看一下问题

raw_list = [["百度", "CPY"], ["京东", "CPY"], ["黄轩", "PN"], ["百度", "CPY"]]

列表嵌套了列表,并且有一个重复列表["百度", "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元素顺序排序,当然肯定要通过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里的索引,根据这个索引进行排序。

代码实现如下:
In [13]: new_list.sort(key=raw_list.index)

In [14]: new_list
Out[14]: [['百度', 'CPY'], ['京东', 'CPY'], ['黄轩', 'PN']]

结果和期望一样 =。=

相关文章

  • Python嵌套列表去重

    人生苦短早用Python 这是工作中遇到的一个坑,首先看一下问题 列表嵌套了列表,并且有一个重复列表["百度", ...

  • Python 列表去重

    1、去重不保持原来的顺序: 2、去重保持原顺序(reduce): 3、list元素是字典,去重

  • Python相关文章索引(11)

    基本常识 python 使用set对列表去重,并保持列表原来顺序 python基础-python函数any()与a...

  • Python列表去重技巧

    Python列表去重在Python应用编程中,是一种非常常见的应用技巧,本文将介绍三种常用的Python列表去重方...

  • 2019-06-13 python种对列表里的字典进行去重

    python中列表去重的方法是set(),但是没有对列表里的字典进行去重的方法。只好自己写一个。

  • 8、Python列表

    上集回顾: Python函数 while循环嵌套 Python列表(list)是一种有序的集合,是 Python ...

  • Python学习-集合(set)

    查看所有Python相关学习笔记 集合(set) 集合是随机的,其元素是不重复的 自动去重 对列表去重 先将列表转...

  • markdown test

    一级标题 二级标题 三级标题 嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表 无序列表 无序列表 有序列表1 有...

  • Python基础-08数据嵌套

    8.数据嵌套     在Python中,各种数据是可以相互嵌套的,如列表中嵌套元组、整型、字典等,字典中也可以嵌套...

  • python--嵌套序列

    python 嵌套序列 嵌套序列:是由一组等长列表组成的列表。 numpy可以对数据进行类型转换, 统计转成字符型,,

网友评论

    本文标题:Python嵌套列表去重

    本文链接:https://www.haomeiwen.com/subject/dzdcgxtx.html