What is the easiest way to compare the 2 lists/sets and output the differences? Are there any built in functions that will help me compare nested lists/sets?
Inputs:
First_list = [['Test.doc', '1a1a1a', 1111], ['Test2.doc', '2b2b2b', 2222], ['Test3.doc', '3c3c3c', 3333] ] Secnd_list = [['Test.doc', '1a1a1a', 1111], ['Test2.doc', '2b2b2b', 2222], ['Test3.doc', '8p8p8p', 9999], ['Test4.doc', '4d4d4d', 4444]]
Expected Output:
Differences = [['Test3.doc', '3c3c3c', 3333], ['Test3.doc', '8p8p8p', 9999], ['Test4.doc', '4d4d4d', 4444]]
Comparing lists in Python The set() function creates an object that is a set object. The cmp() function is used to compare two elements or lists and return a value based on the arguments passed. In the following sections, we will see the application of set() , cmp() , and difference() functions.
Compare using sets in PythonTo compare two lists in python, we can use sets. A set in python only allows unique values in it. We can use this property of sets to find if two lists have the same elements or not. For comparison,first we will check if the length of the lists are equal or not.
Using list.sort() method sorts the two lists and the == operator compares the two lists item by item which means they have equal data items at equal positions. This checks if the list contains equal data item values but it does not take into account the order of elements in the list.
Python Set | difference() The difference between the two sets in Python is equal to the difference between the number of elements in two sets. The function difference() returns a set that is the difference between two sets.
So you want the difference between two lists of items.
first_list = [['Test.doc', '1a1a1a', 1111], ['Test2.doc', '2b2b2b', 2222], ['Test3.doc', '3c3c3c', 3333]] secnd_list = [['Test.doc', '1a1a1a', 1111], ['Test2.doc', '2b2b2b', 2222], ['Test3.doc', '8p8p8p', 9999], ['Test4.doc', '4d4d4d', 4444]]
First I'd turn each list of lists into a list of tuples, so as tuples are hashable (lists are not) so you can convert your list of tuples into a set of tuples:
first_tuple_list = [tuple(lst) for lst in first_list] secnd_tuple_list = [tuple(lst) for lst in secnd_list]
Then you can make sets:
first_set = set(first_tuple_list) secnd_set = set(secnd_tuple_list)
EDIT (suggested by sdolan): You could have done the last two steps for each list in a one-liner:
first_set = set(map(tuple, first_list)) secnd_set = set(map(tuple, secnd_list))
Note: map
is a functional programming command that applies the function in the first argument (in this case the tuple
function) to each item in the second argument (which in our case is a list of lists).
and find the symmetric difference between the sets:
>>> first_set.symmetric_difference(secnd_set) set([('Test3.doc', '3c3c3c', 3333), ('Test3.doc', '8p8p8p', 9999), ('Test4.doc', '4d4d4d', 4444)])
Note first_set ^ secnd_set
is equivalent to symmetric_difference
.
Also if you don't want to use sets (e.g., using python 2.2), its quite straightforward to do. E.g., with list comprehensions:
>>> [x for x in first_list if x not in secnd_list] + [x for x in secnd_list if x not in first_list] [['Test3.doc', '3c3c3c', 3333], ['Test3.doc', '8p8p8p', 9999], ['Test4.doc', '4d4d4d', 4444]]
or with the functional filter
command and lambda
functions. (You have to test both ways and combine).
>>> filter(lambda x: x not in secnd_list, first_list) + filter(lambda x: x not in first_list, secnd_list) [['Test3.doc', '3c3c3c', 3333], ['Test3.doc', '8p8p8p', 9999], ['Test4.doc', '4d4d4d', 4444]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With