Program that returns the non-common numbers of two lists (python)

7

I'm trying to make a program, in Python, that returns a list with elements not common between two other lists. I made the following code:

def indice(a,b):
    ind = []
    for i in range (len(a)):
        for w in range (len(b)):
            if not (a[i] in b) and not (b[w] in a):
                ind = ind + [a[i]] + [b[w]]
    return ind

However, it eventually has repeats in the returned list, and when the first compared list has more elements than the second, the function returns an empty list. Can anyone help me?

    
asked by anonymous 30.03.2017 / 03:33

4 answers

6

Here you have a way equivalent to the response of @ nano.galvao:

nao_comuns = list(set(a) ^ set(b))

But in a didactic way and programming the functionality you can do without using two cycles (I commented in the code some explanations):

def nao_comuns(a,b):
    a_b = a+b # juntar as duas para percorrer todos os elementos
    nao_comuns = []
    for ele in a_b:
        if ele not in a or ele not in b: # nao existe numa delas
            nao_comuns.append(ele)
    return nao_comuns

a = range(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = range(0,20,2) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print nao_comuns(a,b) # [1, 3, 5, 7, 9, 10, 12, 14, 16, 18]

DEMONSTRATION

With list understanding you can do this cycle on a line:

def nao_comuns(a,b):
    a_b = a+b # juntar as duas para percorrer todos os elementos
    return [ele for ele in a_b if ele not in a or ele not in b]

a = range(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = range(0,20,2) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print nao_comuns(a,b) # [1, 3, 5, 7, 9, 10, 12, 14, 16, 18]

DEMONSTRATION

Using a generator :

def nao_comuns(a,b):
    a_b = a+b # juntar as duas para percorrer todos os elementos
    for ele in a_b:
        if ele not in a or ele not in b: # nao existe numa delas
            yield ele

a = range(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = range(0,20,2) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print list(nao_comuns(a,b)) # [1, 3, 5, 7, 9, 10, 12, 14, 16, 18]

DEMONSTRATION

    
30.03.2017 / 10:33
3
def elementos_nao_comuns(a,b):
    return list(set(a).symmetric_difference(set(b)))
    
30.03.2017 / 06:50
2

Already a solution a bit primitive using sets:

1) not common (a, b) = a∪b - a∩b

list((set(a) | set(b)) - (set(a) & set(b)))

2) not common (a, b) = a-b ∪ b-a

list(set(a)-set(b) | set(b)-set(a))
    
30.03.2017 / 12:38
1

Good evening, following your logic I believe that the most correct would be:

def indice(a,b):
    ind = [];
    for ea in a:
        if (not (ea in b)):
            ind.append(ea);
    for eb in b:
        if (not (eb in a)):
            ind.append(eb);
    return ind;

You go through item to item of each list always looking if element does not exist at the other end.

    
30.03.2017 / 05:46