Удалить повторяющиеся строки из двух разных списков? - PullRequest
2 голосов
/ 21 февраля 2020

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

import requests
import numpy as np


list1 = [['dog', 123, -10],['cat', 44, -5],['rabbit', 99, 2]]
list2 = [['dog', 123, -10],['parrot', 44, -5],['rabbit', 99, 2]]

#What we should be left with is ['parrot', 44, -5]

mixem = list1+list2

data = np.array(mixem)

new_array = [tuple(row) for row in data]
uniques = np.unique(new_array)

Что я делаю не так? То, что я хочу оставить, это ['parrot', 44, -5], который является единственной уникальной строкой / набором.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Ну, на самом деле вам не нужно numpy для достижения того, что вы пытаетесь сделать.

Вы можете получить требуемый результат, просто используя a для l oop:

list1 = [['dog', 123, -10],['cat', 44, -5],['rabbit', 99, 2]]
list2 = [['dog', 123, -10],['parrot', 44, -5],['rabbit', 99, 2]]

uniques=[]
for i,j in zip(list1,list2):
  if i!=j:
      uniques.append(j)

print(uniques)

Чтобы ответить на ваш вопрос о том, почему np.unique () не дает вам уникальный кортеж, вы ошибаетесь в том, как он на самом деле работает в вашем случае.

Обратите внимание, что когда вы выполняете: data = np.array (mixem), он фактически создает матрицу numpy, поэтому при выполнении np.unique () он создает все уникальные элементы в матрице numpy.

>>> data
>>> array([['dog', '123', '-10'],
       ['cat', '44', '-5'],
       ['rabbit', '99', '2'],
       ['dog', '123', '-10'],
       ['parrot', '44', '-5'],
       ['rabbit', '99', '2']], dtype='<U6')

В вашем коде список new_array содержит следующие элементы:

>> new_array = [tuple(row) for row in data]
>> new_array
>> [('dog', '123', '-10'), ('cat', '44', '-5'), ('rabbit', '99', '2'), ('dog', '123', '-10'), ('parrot', '44', '-5'), ('rabbit', '99', '2')]

и, следовательно, unique [] содержит:

>>> uniques = np.unique(new_array)
>>> uniques
array(['-10', '-5', '123', '2', '44', '99', 'cat', 'dog', 'parrot',
       'rabbit'], dtype='<U6')

У вас фактически есть список списков сначала, а затем вы конвертируете его в массив numpy (делая, data = np.array (mixem)), а затем снова вы конвертируете его в список кортежей (делая, new_array = [tuple (row) для строка в данных]) и, наконец, вы снова конвертируете его обратно в массив numpy ing, uniques = np.unique (new_array)), что не имеет смысла, так как большая часть кода на самом деле избыточна.

Хорошо, даже если np.uniques каким-то образом будет работать, чтобы предоставить вам уникальные кортежи, тогда он будет производить 4 уникальных кортежа, ie: [('dog', '123', '-10'), ('cat', '44', '-5'), ('rabbit', '99 ',' 2 '), (' parrot ',' 44 ',' -5 ')]

Чтобы получить этот результат, вам нужно использовать axis = 0 в качестве параметра, как показано ниже:

>>> uniques = np.unique(new_array, axis=0)
>>> uniques
array([['cat', '44', '-5'],
       ['dog', '123', '-10'],
       ['parrot', '44', '-5'],
       ['rabbit', '99', '2']], dtype='<U6')

То, что вы пытаетесь сделать, это:

1) Сравнить list1 и list2.

2) Показать элементы списка 2, которых нет в списке1.

Что вы на самом деле делаете:

1) Объединение списков1 и списков 2.

2) Создание numpy матрицы, состоящей из списков1 и списков2 .

3) Поиск уникальных элементов в матрице.

1 голос
/ 21 февраля 2020
for i,j in zip(list1,list2):
  if i!=j:
    print(i)
    print(j)

Output:-
['cat', 44, -5]
['parrot', 44, -5]

Используя это, вы получите оба сейчас, если вы хотите только '[' parrot, 44, -5] ', просто держите' j 'внутри l oop:)

0 голосов
/ 21 февраля 2020

Вы можете использовать наборы для удаления дубликатов из списка. Обратите внимание, что это один из многих способов сделать это, возможно, с помощью pandas, numpy et c.

#given list
list1 = [['dog', 123, -10],['cat', 44, -5],['rabbit', 99, 2]]
list2 = [['dog', 123, -10],['parrot', 44, -5],['rabbit', 99, 2]]

#convert the list to set
set1 = set((tuple(row) for row in list1))
set2 = set((tuple(row) for row in list2))

#use symmetric difference to find the unique elements
s = set1.symmetric_difference(set2) #this will return a set

#to convert back to list
list3 = [list(ele) for ele in s]

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

...