使用set函数生成Python中唯一列表

4

我想要做的是编写一个方法,它以列表作为参数,并使用集合来返回列表的副本,其中每个元素只出现一次,并且新列表中的元素按其在原始列表中第一次出现的顺序排列。我必须使用一个集合来实现这个目的,但是我无法使输出结果正确排序并且速度快。如果我像这样输入:

def unique(a):

return list(set(a))

如果我传递了一个拥有数百万元素的列表,它可以快速地给出结果,但是它不会按顺序排列。 所以,现在我拥有的是这个:
def unique(a):
b = set(a)
c = {}
d = []
for i in b:
    c[a.index(i)] = i
for i in c:
    d.append(c[i])
return d

这个方法给出了我想要的结果,但速度不够快。如果我传递一个包含一百万个元素的列表,可能需要等待半个小时,而上面那个一行代码只需要不到一秒钟。我该如何解决这个问题?

1个回答

8
>>> from collections import OrderedDict
>>> items = [1, 2, 3, 'a', 2, 4, 'a']
>>> OrderedDict.fromkeys(items).keys()
[1, 2, 3, 'a', 4]

谢谢,但我必须以某种方式合并一个集合。有什么办法可以做到这一点吗? - user1744238
1
@user1744238 我的解决方案是你能得到的最有效的,但如果出于某种原因你真的需要使用一个集合,我猜想是为了完成一个任务,那么请参考这个链接:https://dev59.com/IHRB5IYBdhLWcg3w4bEo - jamylak
使用集合的类似方法(但是再次强调,上面的答案更好,不使用集合):items = [1, 2, 3, 'a', 2, 4, 'a']; s = set(); filter(lambda i: not i in s and not s.add(i), items) - thierrybm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接