Вычесть два списка кортежей друг из друга

У меня есть эти два списка, и мне нужно вычесть один из другого, но обычный «-» не будет работать, равно как и .intersection или XOR (^).

A = [(0, 1)]
B = [(0, 0), (0,1), (0, 2)]

По сути, я хочу:

B - A = [(0, 0), (0, 2)]

person Ghazal    schedule 18.09.2016    source источник


Ответы (3)


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

[item for item in B if item not in A]

Дополнительные обсуждения можно найти здесь

person nbryans    schedule 18.09.2016

Если в B и A нет повторяющихся кортежей, может быть лучше сохранить их как наборы и использовать difference наборов:

A = [(0, 1)]
B = [(0, 0), (0,1), (0, 2)]
diff = set(B) - set(A) # or set(B).difference(A)
print(diff)
# {(0, 0), (0, 2)}

Вы можете выполнить и другие операции, например найти intersection между обоими наборами:

>>> set(B) & set(A)
{(0, 1)}

Или даже взять их symmetric_difference:

>>> set(B) ^ set(A)
{(0, 0), (0, 2)}
person Moses Koledoye    schedule 18.09.2016
comment
При использовании таких методов, как .difference, вам не нужно явно преобразовывать A в набор, так как он потребует любой итерации. - person Jon Clements♦; 18.09.2016

Вы можете выполнять такие операции, преобразовывая списки в наборы. Установите разницу:

r = set(B)-set(A)

При необходимости преобразовать в список: list(r)

Работа с наборами эффективнее, чем выполнение операций «в» списках: than-using-just-list-to-compute-a-list">использование списков и наборов для различий в списках

person picmate 涅    schedule 18.09.2016