Как вычесть каждый экземпляр элемента в списке b из списка a

#python #python-3.x

Вопрос:

Итак, у меня есть два нижеприведенных списка на Python:

 a = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
b = [2, 4]
 

и я хочу создать такую функцию, как эта:

 x = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
y = [2, 4]

def array_diff(a, b):
    # CODE HERE

print(array_diff(x, y))   # Output = [1, 3, 3, 3]
 

Я изначально пробовал это решение:

 def array_diff(a, b):
    for item in a:
        for i in range(len(b)):
            if b[i] == item:
                a.remove(b[i])
    return a
 

но этот код возвращает

 [1, 2, 3, 3, 3, 4, 4]
 

Я попытался изменить код, но это не увенчалось успехом. Я пытался найти решения здесь, но ничего не вышло.

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

1. Вы изменяете список во время итерации… Вы пробовали вместо этого создать и вернуть новый список? Кроме того, никакого «математического вычитания» не происходит

2. Вы имеете в виду удалить из списка?

Ответ №1:

Вы можете использовать понимание списка:

 x = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
y = [2, 4]

def array_diff(a, b):
    return [i for i in a if i not in b]

print(array_diff(x, y))
 

Выход:

 [1, 3, 3, 3]
 

Если вы будете использовать array_diff его, повторяя его (не более одного раза), вот так:

 for i in array_diff:
    print(i)
 

вы можете повысить эффективность b, используя yield ключевое слово:

 x = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
y = [2, 4]

def array_diff(a, b):
    for i in a:
        if i not in b:
            yield i

for i in array_diff(x, y):
    print(i)
 

Выход:

 1
3
3
3
 

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

1. Для больших списков, b = set(b) прежде чем возврат может немного улучшить это