Wednesday 24 August 2016

Python unique list using set










What I am trying to do is write a method that takes a list as an argument and uses a set to return a copy of the list where each element only occurs once, as well as having the elements in the new list occur in order of their first occurrence in the original list. I HAVE to use a set for this, however, I can't make it so that the output is in the right order while having a quick result.
If I put something like this:




def unique(a):

return list(set(a))


and passed a list with millions of elements, it would give me a result quickly, but it wouldn't be ordered.
So what I have right now is this:



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


This gives me the result I want, but not fast enough. If I pass a list with a million elements, I could be waiting for half an hour, whereas the one liner up there takes less than a second. How could I solve this problem?



Answer



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

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...