Search code examples
pythonlistcomparison

Check if two unordered lists are equal


I'm looking for an easy (and quick) way to determine if two unordered lists contain the same elements:

For example:

['one', 'two', 'three'] == ['one', 'two', 'three'] :  true
['one', 'two', 'three'] == ['one', 'three', 'two'] :  true
['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] :  false
['one', 'two', 'three'] == ['one', 'two', 'three', 'four'] :  false
['one', 'two', 'three'] == ['one', 'two', 'four'] :  false
['one', 'two', 'three'] == ['one'] :  false

I'm hoping to do this without using a map.


Solution

  • 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)
    

    Documentation on set


    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
    >>>