У меня есть эти два списка, и мне нужно вычесть один из другого, но обычный «-» не будет работать, равно как и .intersection или XOR (^).
A = [(0, 1)]
B = [(0, 0), (0,1), (0, 2)]
По сути, я хочу:
B - A = [(0, 0), (0, 2)]
У меня есть эти два списка, и мне нужно вычесть один из другого, но обычный «-» не будет работать, равно как и .intersection или XOR (^).
A = [(0, 1)]
B = [(0, 0), (0,1), (0, 2)]
По сути, я хочу:
B - A = [(0, 0), (0, 2)]
Вы можете использовать понимание списка, чтобы решить эту проблему:
[item for item in B if item not in A]
Дополнительные обсуждения можно найти здесь
Если в 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)}
.difference
, вам не нужно явно преобразовывать A
в набор, так как он потребует любой итерации.
- person Jon Clements♦; 18.09.2016
Вы можете выполнять такие операции, преобразовывая списки в наборы. Установите разницу:
r = set(B)-set(A)
При необходимости преобразовать в список: list(r)
Работа с наборами эффективнее, чем выполнение операций «в» списках: than-using-just-list-to-compute-a-list">использование списков и наборов для различий в списках