Python Codewars: can someone explain how/why this happens?

Question:

I’m doing Codewars and got stuck at this simple question. The question was:

Your goal in this kata is to implement a difference function, which subtracts one list from
another and returns the result.
It should remove all values from list a, which are present in list b keeping their order.
If a value is present in b, all of its occurrences must be removed from the other.

This is what I’ve tried:

def array_diff(a, b):
    if a == []: return b
    if b == []: return a
    for occurrence in b:
      if occurrence in a:
        a.remove(occurrence)
    return a

and for some reason I got 2 failed tests, the requirements for those failed tests are:

a was [1,2,2], b was [2], expected [1]: [1, 2] should equal [1]

a was [], b was [1,2], expected []: [1, 2] should equal []

can anyone help me and also explain if possible? any help is appreciated.
edit: my excuse is that I’m a beginner to Python so, sorry if this question has super obvious errors/mistakes

Answers:

You can try and modify your code as follows:

def array_diff(a, b):
    if a == []: return a
    if b == []: return a
    for occurrence in b:
        if occurrence in a:
            a = list(filter(lambda val: val != occurrence, a)
    return a
Answered By: picchiolu

I fixed it. Here’s the code if anyone’s stuck on the same question:
The first code was provided by Matthias, which was much cleaner, please use it.

def array_diff(a, b):    
    return [value for value in a if value not in b]
    # CREDITS TO MATTHIAS FOR THIS SIMPLE SOLUTION

My code, if anyone’s interested:

def array_diff(a, b):
    #if a == []: return b
    #if b == []: return a
    # these if statements are replaced by the"for item in range" code below
    for occurrence in b:
      if occurrence in a:
        for item in range(a.count(occurrence)):
            a.remove(occurrence)
    return a

The answer provided did not completely work for me although it was very helpful, this is what i came up with and it worked.
Happy Coding!

def array_diff(a, b):
    #your code here
    for i in b: 
        if i == None:
            return a
            break  
        elif i in a:
            for item in range(a.count(i)):
                a.remove(i)
    return a
Answered By: paigeph