Skip to content Skip to sidebar Skip to footer

Comparing Two Lists And Only Printing The Differences? (xoring Two Lists)

I'm trying to create a function that takes in 2 lists and returns the list that only has the differences of the two lists. Example: a = [1,2,5,7,9] b = [1,2,4,8,9] The result sho

Solution 1:

You basically want to add an element to your new list if it is present in one and not present in another. Here is a compact loop which can do it. For each element in the two lists (concatenate them with list1+list2), we add element if it is not present in one of them:

[a for a in list1+list2 if (a not in list1) or (a not in list2)]

You can easily transform it into a more unPythonic code with explicit looping through elements as you have now, but honestly I don't see a point (not that it matters):

defxor(list1, list2):
    outputlist = []
    list3 = list1 + list2
    for i inrange(0, len(list3)):
        if ((list3[i] notin list1) or (list3[i] notin list2)) and (list3[i] notin outputlist):
             outputlist[len(outputlist):] = [list3[i]]
    return outputlist

Solution 2:

Use set is better

>>>a = [1,2,5,7,9]>>>b = [1,2,4,8,9]>>>set(a).symmetric_difference(b)
{4, 5, 7, 8}

Thanks to @DSM, a better sentence is:

>>>set(a)^set(b)

These two statements are the same. But the latter is clearer.

Update: sorry, I did not see the last requirement: cannot use set. As far as I see, the solution provided by @sashkello is the best.

Solution 3:

Note: This is really unpythonic and should only be used as a homework answer :)

After you have sorted both lists, you can find duplicates by doing the following:

1) Place iterators at the start of A and B

2) If Aitr is greater than Bitr, advance Bitr after placing Bitr's value in the return list

3) Else if Bitr is greater than Aitr, advance Aiter after placing Aitr's value in the return list

4) Else you have found a duplicate, advance Aitr and Bitr

Solution 4:

This code works assuming you've got sorted lists. It works in linear time, rather than quadratic like many of the other solutions given.

defdiff(sl0, sl1):
    i0, i1 = 0, 0while i0 < len(sl0) and i1 < len(sl1):
        if sl0[i0] == sl1[i1]:
            i0 += 1
            i1 += 1elif sl0[i0] < sl1[i1]:
            yield sl0[i0]
            i0 += 1else:
            yield sl1[i1]
            i1 += 1for i in xrange(i0, len(sl0)):
        yield sl0[i]
    for i in xrange(i1, len(sl1)):
        yield sl1[i]

printlist(diff([1,2,5,7,9], [1,2,4,8,9]))

Solution 5:

Try this,

    a = [1,2,5,7,9]
    b = [1,2,4,8,9]
 printset(a).symmetric_difference(set(b))

Post a Comment for "Comparing Two Lists And Only Printing The Differences? (xoring Two Lists)"