Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compare a list of lists/sets in python?

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]] 
like image 777
tang Avatar asked May 24 '11 04:05

tang


People also ask

How do you compare lists with sets?

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.

Can you compare a list and a set in Python?

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.

How do you compare lists in Python?

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.

How do you compare two sets in Python?

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.


1 Answers

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]] 
like image 143
dr jimbob Avatar answered Oct 07 '22 18:10

dr jimbob