Reputation: 6393
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: 14173
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
Reputation: 11399
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
Reputation: 13972
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
Reputation: 20151
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
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. 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. Upvotes: 2
Reputation: 52381
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
Reputation: 91502
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
Reputation: 273806
There's a nice class called difflib.SequenceMatcher
in the standard library for that.
Upvotes: 2