2015-08-10 3 views
0

я искал решение, чтобы удалить deplicates из двух 2d списка в Python я не мог найти, так вот мой вопрос:
У меня есть два списка, напримерудаление дубликатов из двух 2 мерных список

[[1,2],[3,5],[4,4],[5,7]] 

[[1,3],[4,4],[3,5],[3,5],[5,6]] 

Ожидаемый результат:

[[1,2],[1,3],[5,7],[5,6]] 

Я хочу, чтобы удалить список внутри на списках, которые соответствуют ТОЧНО значения другого списка.

мой сценарий:

def filter2dim(firstarray, secondarray): 
    unique = [] 
    for i in range(len(firstarray)): 
     temp=firstarray[i] 
     for j in range(len(secondarray)): 
      if(temp == secondarray[j]): 
       break 
      elif(j==(len(secondarray)-1)): 
       unique.append(temp) 
    for i in range(len(secondarray)): 
     temp=secondarray[i] 
     for j in range(len(firstarray)): 
      if(temp == firstarray[j]): 
       break 
      elif(j==(len(firstarray)-1)): 
       unique.append(secondarray[i]) 
    return 

Пожалуйста, если вы это исправить и объяснить, что вы сделали это будет greateful. Спасибо, С наилучшими пожеланиями

+1

Почему '[1, 2]' не является результатом? – thefourtheye

+0

ах да и [1,2] извините –

+1

Как '[5,6]' входит в обман? – erip

ответ

2

Заменить списки 2-записи с кортежами, и вы можете использовать набор операции (поскольку кортежи неизменны и списки нет, и установить элементы должны быть неизменны):

a = {(1,2),(3,5),(4,4),(5,7)} 
b = {(1,3),(4,4),(3,5),(3,5),(5,6)} 
print(a.symmetric_difference(b)) # {(1, 2), (1, 3), (5, 6), (5, 7)} 

Примечания это также удаляет дубликаты в каждом списке, потому что они являются наборами, а порядок игнорируется.

Если вам нужно программно конвертировать ваши списки в кортежах, список постижение работает просто отлично:

list_a = [[1,2],[3,5],[4,4],[5,7]] 
set_a = {(i, j) for i, j in a} 
print(set_a) # {(1, 2), (4, 4), (5, 7), (3, 5)} 
+0

хм, извините, я не очень симпатичный с питоном, как swtich их на кортежи? –

+0

@ user2597549 Просто отредактировал вопрос с этим ответом. – BoppreH

+0

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

1

Ваш скрипт отлично работает для меня, просто добавьте: return unique

+0

да, я знаю, но иногда у меня есть списки, которые будут стоить 1000 значений. –

0

Включите первый список в dict:

a = [[1, 2], [3, 5], [4, 4], [5, 7]] 
b = [[1, 3], [4, 4], [3, 5], [3, 5], [5, 6]] 

filt = dict(a) 
result = [el for el in b if el[0] in filt and el[0] == filt[el[0]]] 

в качестве альтернативы, включить первый список в набор кортежей, и просто проверить на членство:

filt = set(map(tuple, a)) 
result = [el for el in b if tuple(el) in filt] 

Оба эти решения избежать переборе первого списка более чем один раз, так как dict и set поиски являются O (1).

+0

I верьте, что 'Counter' - лучшая структура, основанная на хэш-таблице, для такого рода вещей, т.е.е. считая :) –