2016-08-29 6 views
1

Рассмотрим два списка A и B. Я знаю, что list(set(A) - set(B)) даст разницу между A и B. Как насчет ситуации, когда элементы в A и B являются списками. то есть A и B являются списком списка? Напр.Python способ сделать разницу списков, содержащих списки

A = [[1,2], [3,4], [5,6]] 
B = [[3,4], [7,8]] 

Я хочу вернуть разницу A - B в виде списка списка т.е. [[1,2],[5,6]]

list(set(A) - set(B)) 
TypeError: unhashable type: 'list' 
+0

Возможный дубликат [Получить разницу между двумя списками] (http://stackoverflow.com/questions/3462143/get-difference-between-two-lists) – GoatsWearHats

+0

'дифф = [а при а в A, если нет в B] '? – Delgan

ответ

1

Идея заключается в том, чтобы преобразовать список списков в списки кортежей,
которые hashable и, таким образом, кандидаты решений Устанавливает себя:

In [192]: C = set(map(tuple, A)) - set(map(tuple, B)) 

In [193]: C 
Out[193]: {(1, 2), (5, 6)} 

И еще одно касание:

In [196]: [*map(list, C)] 
Out[196]: [[1, 2], [5, 6]] 

ДОБАВЛЕНО

В питона 2,7 завершающим штрихом проще:

map(list, C) 
+0

Я думаю, вы должны переформатировать свой ответ так, как это требует OP. Может быть «список списков», а не «набор кортежей». –

+0

Сделал это, спасибо. –

+0

@IsraelUnterman Похоже, что python 2.7 не поддерживает выделенное выражение '[* map (list, C)]' – DougKruger

1

Вот один вкладыш можно использовать:

diff = [x for x in A if x not in B] 

Или, если вы хотите использовать фильтр:

diff = list(filter(lambda x: x not in B, A)) 
+0

Я получил это. 'TypeError: объект 'list' не является вызываемым'. A и B - оба списка списков. – DougKruger

+0

@DougKruger. У вас, вероятно, есть переменная, фактически названная «списком» где-то в вашей программе, которая переопределяет встроенную функцию списка! Просмотрите свой код, и если у вас есть переменная с именем «list», измените это имя на другое. – gowrath

+0

@DougKruger Или используйте первую версию. Но обратите внимание, что, вероятно, есть ошибка в вашей программе, если вы вызвали что-то в своем «списке» программы. – gowrath

1
>>> [i for i in A if i not in B] 
[[1, 2], [5, 6]] 
+0

'TypeError: объект 'list' не является вызываемым' A и B являются списками списка. – DougKruger

+0

Невозможно воспроизвести ошибку как в 'python2', так и' python3', отлично работает. Может быть, ошибка исходит из какой-то другой части вашей программы. –

1
A = [[1, 2], [3, 4], [5, 6]] 
B = [[3, 4], [7, 8]] 

print[x for x in A if x not in B] 
Смежные вопросы