Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 should print [4,5,7,8]

The function so far:

def xor(list1, list2):
    list3=list1+list2
    for i in range(0, len(list3)):
        x=list3[i]
        y=i
        while y>0 and x<list3[y-1]:
            list3[y]=list3[y-1]
            y=y-1
        list3[y]=x

        last=list3[-1]
    for i in range(len(list3) -2, -1, -1):
        if last==list3[i]:
            del list3[i]
        else:
            last=list3[i]

    return list3 
print xor([1,2,5,7,8],[1,2,4,8,9])

The first for loop sorts it, second one removes the duplicates. Problem is the result is [1,2,4,5,7,8,9] not [4,5,7,8], so it doesn't completely remove the duplicates? What can I add to do this. I can't use any special modules, .sort, set or anything, just loops basically.

like image 498
user2314520 Avatar asked May 01 '13 04:05

user2314520


People also ask

How do I compare two lists and differences in Python?

The difference between two lists (say list1 and list2) can be found using the following simple function. By Using the above function, the difference can be found using diff(temp2, temp1) or diff(temp1, temp2) . Both will give the result ['Four', 'Three'] .

How do you find the difference in lists in Python?

To get the symmetric difference between two lists in Python: Convert the lists to sets. Use the built-in symmetric_difference() function of sets to get the symmetric difference. Convert the result back to a list.


1 Answers

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):

def xor(list1, list2):
    outputlist = []
    list3 = list1 + list2
    for i in range(0, len(list3)):
        if ((list3[i] not in list1) or (list3[i] not in list2)) and (list3[i] not in outputlist):
             outputlist[len(outputlist):] = [list3[i]]
    return outputlist
like image 137
sashkello Avatar answered Oct 06 '22 00:10

sashkello