#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)
прежде чем возврат может немного улучшить это