Кодовые войны Python: может ли кто-нибудь объяснить, как/почему это происходит?

#python #arrays #multiple-occurrence

Вопрос:

Я занимаюсь кодовыми войнами и застрял на этом простом вопросе. Вопрос был в том,:

Ваша цель в этом ката-реализовать функцию различий, которая вычитает один список из другого и вернет результат. Он должен удалить все значения из списка a, которые присутствуют в списке b, сохраняя их порядок. Если значение присутствует в b, все его вхождения должны быть удалены из другого.

Это то, что я пробовал:

 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
 

и по какой-то причине я получил 2 неудачных теста, требования к этим неудачным тестам следующие:

 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 []
 

кто-нибудь может мне помочь, а также объяснить, если это возможно? любая помощь будет признательна.
редактировать: мое оправдание в том, что я новичок в Python, так что извините, если в этом вопросе есть супер очевидные ошибки/ошибки

Комментарии:

1. Разве простого return [value for value in a if value not in b] не было бы достаточно?

2. Пожалуйста, не редактируйте свой вопрос, чтобы включить ответ, вы можете ответить на свой собственный вопрос, если хотите. Или, если ответ пикчиолу подходит вам, вы можете принять его (маленькая зеленая галочка).

3. ну ладно, спасибо за предложение. Также спасибо тебе, Матиас, за ответ. Это работало и было намного чище, чем мой код

Ответ №1:

Вы можете попробовать изменить свой код следующим образом:

 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
 

Комментарии:

1. каким-то образом ваш ответ выдал мне сообщение об ошибке в последней строке. Это был синтаксис ошибки

2. Я все исправил. Я ценю ваш ответ, хотя, спасибо!

3. Я думаю, что я напутал с отступами. Я изменил свой ответ.

4. О, хорошо. Отлично! Пожалуйста, подумайте о том, чтобы выбрать мой ответ, если вы нашли его полезным.

Ответ №2:

Я все исправил. Вот код, если кто-то застрял на том же вопросе: первый код был предоставлен Маттиасом, который был намного чище, пожалуйста, используйте его.

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

Мой код, если кому-то интересно:

 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