Check if two unordered lists are equal
Hire the world's top talent on demand or became one of them at Toptal: https://topt.al/25cXVn
and get $2,000 discount on your first invoice
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Digital Sunset Looping
--
Chapters
00:00 Check If Two Unordered Lists Are Equal
00:25 Accepted Answer Score 618
01:05 Answer 2 Score 21
01:32 Answer 3 Score 84
02:02 Answer 4 Score 65
02:25 Thank you
--
Full question
https://stackoverflow.com/questions/9623...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #list #comparison
#avk47
ACCEPTED ANSWER
Score 618
Python has a built-in datatype for an unordered collection of (hashable) things, called a set. If you convert both lists to sets, the comparison will be unordered.
set(x) == set(y)
EDIT: @mdwhatcott points out that you want to check for duplicates. set ignores these, so you need a similar data structure that also keeps track of the number of items in each list. This is called a multiset; the best approximation in the standard library is a collections.Counter:
>>> import collections
>>> compare = lambda x, y: collections.Counter(x) == collections.Counter(y)
>>> 
>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3,3], [1,2,2,3])
False
>>> 
ANSWER 2
Score 84
If elements are always nearly sorted as in your example then builtin .sort() (timsort) should be fast:
>>> a = [1,1,2]
>>> b = [1,2,2]
>>> a.sort()
>>> b.sort()
>>> a == b
False
If you don't want to sort inplace you could use sorted().
In practice it might always be faster then collections.Counter() (despite asymptotically O(n) time being better then O(n*log(n)) for .sort()). Measure it; If it is important.
ANSWER 3
Score 65
sorted(x) == sorted(y)
Copying from here: Check if two unordered lists are equal
I think this is the best answer for this question because
- It is better than using counter as pointed in this answer
 - x.sort() sorts x, which is a side effect. sorted(x) returns a new list.
 
ANSWER 4
Score 21
You want to see if they contain the same elements, but don't care about the order.
You can use a set:
>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three'])
True
But the set object itself will only contain one instance of each unique value, and will not preserve order.
>>> set(['one', 'one', 'one']) == set(['one'])
True
So, if tracking duplicates/length is important, you probably want to also check the length:
def are_eq(a, b):
    return set(a) == set(b) and len(a) == len(b)