python中对list去重的多种方法

yipeiwu_com6年前Python基础

今天遇到一个问题,在同事随意的提示下,用了 itertools.groupby 这个函数。不过这个东西最终还是没用上。

问题就是对一个list中的新闻id进行去重,去重之后要保证顺序不变。

直观方法

最简单的思路就是:

复制代码 代码如下:

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)

print news_ids

这样也可行,但是看起来不够爽。

用set

另外一个解决方案就是用set:

复制代码 代码如下:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

这样的结果是没有保持原来的顺序。

按照索引再次排序

最后通过这种方式解决:

复制代码 代码如下:

ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)

使用itertools.grouby

文章一开始就提到itertools.grouby, 如果不考虑列表顺序的话可用这个:

复制代码 代码如下:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)

for k, g in it:
    print k

关于itertools.groupby的原理可以看这里:http://docs.python.org/2/library/itertools.html

网友补充:用reduce

网友reatlk留言给了另外的解决方案。我补充并解释到这里:

复制代码 代码如下:

In [5]: ids = [1,4,3,3,4,2,3,4,5,6,1]

In [6]: func = lambda x,y:x if y in x else x + [y]

In [7]: reduce(func, [[], ] + ids)
Out[7]: [1, 4, 3, 2, 5, 6]


上面是我在ipython中运行的代码,其中的 lambda x,y:x if y in x else x + [y] 等价于 lambda x,y: y in x and x or x+[y] 。

思路其实就是先把ids变为[[], 1,4,3,......] ,然后在利用reduce的特性。reduce解释参看这里:http://docs.python.org/2/library/functions.html

相关文章

Python实现PyPDF2处理PDF文件的方法示例

Python实现PyPDF2处理PDF文件的方法示例

实际应用中,可能会涉及处理 pdf 文件,PyPDF2 就是这样一个库,使用它可以轻松的处理 pdf 文件,它提供了读,割,合并,文件转换等多种操作。 文档地址:http://pytho...

将Django使用的数据库从MySQL迁移到PostgreSQL的教程

我们已对 Django1.6 app完成了数据库从mysql到PostgreSQL的迁移,如果你的环境很干净,这个过程就会很简单,只要允许syncdb 或者 migrate创建表,tru...

Pycharm学习教程(4) Python解释器的相关配置

Pycharm学习教程(4) Python解释器的相关配置

Python解释器的相关配置,供大家参考,具体内容如下 1、准备工作   (1)Pycharm版本为3.4或者更高。   (2)电脑上至少已经安装了一个Python解释器。   (3)如...

Django 对象关系映射(ORM)源码详解

前言 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道....

python pyinstaller打包exe报错的解决方法

python pyinstaller打包exe报错的解决方法

今天用python 使用pyinstaller打包exe出现错误 环境pyqt5 + python3.6 32位 在导入pyqt5包之前加上如下代码 import sys impo...