Python – поиск дополнения из 2 списков

Я ищу метод, который позволил бы мне проверить, какие элементы отсутствуют при сравнении двух списков. Очень похоже на эту тему, но я хочу написать это в NumPy Python.

Дополнение двух списков?

import numpy as np

numbers = np.array([1,2,3,4,5,6,7,8,9])
A = np.array([2,5,6,9])

def listComplementElements(list1, list2):

    storeResults = []

    for i in list1:
        for j in list2:

            if i != j:
                #write to storeResults if 2 numbers are different
                storeResults.append(i)
            else:
                #if numebrs are equal break out of the loop
                break

    return storeResults            

result = listComplementElements(numbers, A)
print(result) #expected result [1,3,4,7,8]

На данный момент вывод выглядит так: [1, 1, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9]

Что я делаю не так?


person michal-ko    schedule 20.03.2019    source источник
comment
@Prune, это интересный дублирующий выбор, могу ли я предложить: stackoverflow.com/questions/42273686/ или stackoverflow.com/questions/6486450/   -  person Nick    schedule 20.03.2019
comment
@NickA: намного лучше; Спасибо. Добавил в список дублеров.   -  person Prune    schedule 20.03.2019


Ответы (2)


Это то, к чему вы стремились:

import numpy as np

numbers = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
A = np.array([2, 5, 6, 9])

def listComplementElements(list1, list2):
    storeResults = []

    for num in list1:
        if num not in list2: # this will essentially iterate your list behind the scenes
            storeResults.append(num)

    return storeResults

result = listComplementElements(numbers, A)
print(result) #expected result [1,3,4,7,8]

Отпечатки:

[1, 3, 4, 7, 8]

У вас должен быть только один цикл, а затем сказать if not in, чтобы оценить связь со вторым списком. В противном случае вы будете зацикливаться без необходимости и, как вы видели, он будет выводить результат много раз! Кроме того, использование таких операторов, как is in или not in, делает ваш код более читабельным, чем попытка понять множество вложенных циклов :)

person Reedinationer    schedule 20.03.2019

Это даст вам дополнение двух массивов:

list(set(numbers) - set(A))
[1, 3, 4, 7, 8]

Если у вас есть повторяющиеся значения, которые вы хотите сохранить, вы можете использовать следующее:

from collections import Counter

c1 = Counter(numbers)
c2 = Counter(A)

diff = c1 - c2
print(list(diff.elements()))
person Nathaniel    schedule 20.03.2019
comment
Это правда. Если вы хотите сохранить повторяющиеся значения, потребуется другой метод. Я обновил свой ответ, чтобы включить один. - person Nathaniel; 20.03.2019