сравнивая два массива и получая значения, которые не являются общими - PullRequest
0 голосов
/ 31 августа 2018

Я решаю эту проблему, которую дал мне друг, где вам дают 2 массива (a [1,2,3,4] и b [8,7,9,2,1]), и вы должны найти не общие элементы. Ожидаемый результат - [3,4,8,7,9]. Код ниже.

def disjoint(e,f):
c = e[:]
d = f[:]
for i in range(len(e)):
    for j in range(len(f)):
        if e[i] == f[j]:
            c.remove(e[i])
            d.remove(d[j])
final = c + d
print(final)

print(disjoint(a,b))

Я пытался с помощью вложенных циклов и создания копий заданных массивов изменить их, затем добавить, но ...

def disjoint(e,f):
c = e[:]                      # list copies
d = f[:]
for i in range(len(e)):
    for j in range(len(f)):
        if e[i] == f[j]:
            c.remove(c[i])     # edited this line
            d.remove(d[j])
final = c + d
print(final)

print(disjoint(a,b))

когда я пытаюсь удалить общий элемент из списка, я получаю другой вывод [2,4,8,7,9]. Зачем ?? Это мой первый вопрос на этом сайте. Я буду благодарен, если кто-нибудь сможет рассеять мои сомнения.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете упростить ваш код, чтобы он заработал:

def disjoint(e,f):
    c = e.copy() # [:] works also, but I think this is clearer
    d = f.copy()
    for i in e: # no need for index. just walk each items in the array
        for j in f:
            if i == j: # if there is a match, remove the match.
                c.remove(i)
                d.remove(j)
    return c + d

print(disjoint([1,2,3,4],[8,7,9,2,1]))

Попробуйте онлайн!

Есть много более эффективных способов достичь этого. Проверьте этот вопрос переполнения стека, чтобы обнаружить их: Получить разницу между двумя списками . Мой любимый способ - использовать set (как в ответе @ newbie). Что такое set? Давайте посмотрим документацию :

Объект set - это неупорядоченная коллекция различных объектов hashable. Обычное использование включает проверку членства, удаление дубликатов из последовательности и вычисление математических операций, таких как пересечение, объединение, разность и симметричная разность . (Для других контейнеров см. Встроенные классы dict, list и tuple и модуль collection.)

шахтный упор

Симметричная разница идеально подходит для наших нужд!

Возвращает новый набор с элементами либо в наборе, либо в указанном итерируемом, но не в обоих.

Хорошо, вот как это использовать в вашем случае:

def disjoint(e,f):
    return list(set(e).symmetric_difference(set(f)))

print(disjoint([1,2,3,4],[8,7,9,2,1]))

Попробуйте онлайн!

0 голосов
/ 31 августа 2018

Используя sets вы можете сделать:

a = [1,2,3,4]
b = [8,7,9,2,1]
diff = (set(a) | set(b)) - (set(a) & set(b))

(set(a) | set(b)) - это объединение, set(a) & set(b) - это пересечение, и, наконец, вы делаете различие между двумя наборами, используя -.

Ваша ошибка возникает, когда вы удаляете элементы в строках c.remove(c[i]) и d.remove(d[j]). Действительно, общими элементами являются e[i] и f[j], тогда как c и d являются списками, которые вы обновляете.
Чтобы исправить ошибку, вам нужно всего лишь изменить эти строки на c.remove(e[i]) и d.remove(f[j]).

Обратите внимание, что ваш метод удаления элементов в обоих списках не будет работать, если список может содержать дубликаты . Рассмотрим, например, случай a = [1,1,2,3,4] и b = [8,7,9,2,1].

...