首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python列表(set(list(.))移除重复项

Python列表(set(list(.))移除重复项
EN

Stack Overflow用户
提问于 2015-10-01 04:29:44
回答 3查看 8.7K关注 0票数 8

代码语言:javascript
运行
复制
list(set(some_list))

从列表中删除副本的好方法?(Python 3.3,如果这重要的话)

(编辑以回应一些评论.可能以前太简洁了)。

具体来说,

  • 在效率(主要是速度,但也包括内存)方面,它至少比编写自己的算法好吗?这显然是最简洁的代码
  • 它可靠吗?有什么破坏的情况吗?(有人已经提到过.列表项目需要是可理解的)
  • 有没有更多的毕森纳式的方式去做呢?
EN

回答 3

Stack Overflow用户

发布于 2015-10-01 15:12:22

您展示的方法可能是最短的,也是最容易理解的;根据大多数定义,这将使它成为Pythonic。

如果需要保留列表的顺序,可以使用collections.OrderedDict而不是set

代码语言:javascript
运行
复制
list(collections.OrderedDict((k, None) for k in some_list).keys())

编辑:对于Python3.7(或者3.6,如果您是信任的话),没有必要使用OrderedDict;普通的dict共享保留插入顺序的属性。这样您就可以重写上面的内容:

代码语言:javascript
运行
复制
list({k: None for k in some_list}.keys())

如果元素不可接受,但可以排序,则可以使用itertools.groupby删除重复的元素:

代码语言:javascript
运行
复制
list(k for k,g in itertools.groupby(sorted(some_list)))

编辑:上面可以写成一个列表理解,有些人可能会认为更毕达通。

代码语言:javascript
运行
复制
[k for k,_ in itertools.groupby(sorted(some_list))]
票数 5
EN

Stack Overflow用户

发布于 2015-10-02 09:21:49

(正如评论中所建议的那样,还添加了这个评论作为回答。)

在我看来,你自己的解决方案看上去很好,而且很吸引人。如果使用的是Numpy,也可以使用new_list = numpy.unique(some_list)。这个或多或少的“读起来就像一个句子”,我相信这是一个很好的基准,是什么东西是“毕加索”。

票数 4
EN

Stack Overflow用户

发布于 2015-10-02 09:40:56

为了保持最短的顺序(从Python2.7开始):

代码语言:javascript
运行
复制
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']

如果没有必要保留订单,list(set(...))就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32879491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档