randomThought
randomThought

Reputation: 6393

Pythonic way to compare two lists and print out the differences

I have two lists which are guaranteed to be the same length. I want to compare the corresponding values in the list (except the first item) and print out the ones which dont match. The way I am doing it is like this

i = len(list1)
if i == 1:
    print 'Nothing to compare'
else:
    for i in range(i):
        if not (i == 0):
            if list1[i] != list2[i]:
                print list1[i]
                print list2[i]

Is there a better way to do this? (Python 2.x)

Upvotes: 16

Views: 14150

Answers (7)

shivam bhatnagar
shivam bhatnagar

Reputation: 400

You can use set operation to find Symmetric difference (^) between two lists. This is one of the best pythonic ways to do this.

list1=[1,2,3,4]
list2=[1,5,3,4]

print(set(list1) ^ set(list2))

So the output will be {2, 5}

Upvotes: 0

Jim
Jim

Reputation: 11379

You could use sets:

>>> list1=[1,2,3,4]
>>> list2=[1,5,3,4]
>>> set(list1[1:]).symmetric_difference(list2[1:])
set([2, 5])

Upvotes: 2

RyanWilcox
RyanWilcox

Reputation: 13974

Nobody's mentioned filter:

a = [1, 2, 3]
b = [42, 3, 4]

aToCompare = a[1:]
bToCompare = b[1:]

c = filter( lambda x: (not(x in aToCompare)), bToCompare)
print c

Upvotes: 5

Phil H
Phil H

Reputation: 20131

Noting the requirement to skip the first line:

from itertools import izip
both = izip(list1,list2)
both.next()  #skip the first
for p in (p for p in both if p[0]!=p[1]):
   print pair
  1. This uses izip, an iterator (itertools) version of zip, to generate an iterator through pairs of values. This way you don't use up a load of memory generating a complete zipped list.
  2. It steps the both iterator by one to avoid processing the first item, and to avoid having to make the index comparison on every step through the loop. It also makes it cleaner to read.
  3. Finally it steps through each tuple returned from a generator which yields only unequal pairs.

Upvotes: 2

Mizipzor
Mizipzor

Reputation: 52321

list1=[1,2,3,4]
list2=[1,5,3,4]
print [(i,j) for i,j in zip(list1,list2) if i!=j]

Output:

[(2, 5)]

Edit: Easily extended to skip n first items (same output):

list1=[1,2,3,4]
list2=[2,5,3,4]
print [(i,j) for i,j in zip(list1,list2)[1:] if i!=j]

Upvotes: 21

Jimmy
Jimmy

Reputation: 91442

edit: oops, didn't see the "ignore first item" part

from itertools import islice,izip

for a,b in islice(izip(list1,list2),1,None):
    if a != b:
       print a, b

Upvotes: 2

Eli Bendersky
Eli Bendersky

Reputation: 273386

There's a nice class called difflib.SequenceMatcher in the standard library for that.

Upvotes: 2

Related Questions